linux和c的行分隔符

在C(客户端)和JAVA(服务端)通信的过程中,若服务端装在linux系统下,服务端发送的消息客户端无法解析,而在windows系统下是正常的。
经过分析发现是linux系统下发送的行分隔符和windows下不一样,导致客户端无法解析。
下面首先看下回车和换行的概念。
符号 ASCII码 意义
\n 10(0A) 换行
\r 13(0D) 回车CR
在Windows中,每行结尾是“<回车><换行>”,即“\r\n”
'\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
'\n' 换行,换到当前位置的下一行,而不会回到行首
linux系统下,每行结尾只有“<换行>”,即"\n"。
Linux中遇到换行符("\n")会进行回车+换行的操作。
在编写文本时,
在linux下的回车键只代表\n
而在windows下的回车键表示\r\n
ps:因此,如果在windows系统编写shell脚本,点击回车时,实际写入的是\r\n。
然后在linux运行时,反而报错,用文本编辑器打开脚本,会发现每行结尾多了个"^M",而"^M"就是回车符。
回到c和java通信中来,通信之间约定的每条消息的分隔符是行分隔符。
服务端发送消息类是使用的PrintWriter的println方法,该方法除了会发送必要的消息串,最后还会调用println方法发送行分隔符lineSeparator。
而行分隔符的值是在构造PrintWriter的时候确定的,
public PrintWriter(Writer out,
boolean autoFlush) {
super(out);
this.out = out;
this.autoFlush = autoFlush;
lineSeparator = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("line.separator"));
}
可知line.separator属性的值随系统的不同而不同。即在Windows中是“\r\n”,linux系统中是"\n"。
由于客户端只处理了windows下行分隔符的情景,未处理linux场景下的行分隔符导致解析失败。
而无论客户端部署在windows还是部署linux系统下,服务端都可以正确接收并解析客户端发送的请求,这是因为服务端接收到请求后使用的是BufferReader.readline方法,该方法注释如下:
/**
* Reads a line of text. A line is considered to be terminated by any one
* of a line feed ('\n'), a carriage return ('\r'), or a carriage return
* followed immediately by a linefeed.
*
* @return A String containing the contents of the line, not including
* any line-termination characters, or null if the end of the
* stream has been reached
*
* @exception IOException If an I/O error occurs
*
* @see java.nio.file.Files#readAllLines
*/
public String readLine() throws IOException {
return readLine(false);
}
意思就是读取一行文本,一行文本的结束符可以是'\n'(unix),'\r'(mac),'\r\n'(windows)中的一种,这就囊括了所有系统的行分隔符,所以服务端读取时没有问题。
因此C客户端也要参照这种实现来修改,即可正确解析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值