linux和c的行分隔符
来源:互联网 发布:windows defender win7 编辑:程序博客网 时间:2024/06/05 11:55
在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客户端也要参照这种实现来修改,即可正确解析。
经过分析发现是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客户端也要参照这种实现来修改,即可正确解析。
阅读全文
0 0
- linux和c的行分隔符
- windows和linux下的分隔符
- windows和linux分隔符的区别
- window 和linux系统分隔符的不同
- java获得平台相关的行分隔符和java路径分隔符的方法
- java获得平台相关的行分隔符和java路径分隔符的方法
- 分隔符分隔的字符串
- java的注释和分隔符
- Linux命令分隔符
- PHP在windows和LINUX下的路径分隔符 DIRECTORY_SEPARATOR
- PHP在windows和LINUX下的路径分隔符 DIRECTORY_SEPARATOR
- windows和Linux以及Java中路径分隔符的不同
- windows和Linux文件路径分隔符的不同及获取
- (C++) 分隔符匹配
- GET请求中参数分隔符分号(;)和and符(&)分隔参数的区别
- linux下c/c++实例之八字符串分隔、去空格和转大小写
- Hive的行分隔符<转>
- 分隔符File.separator和File.pathSeparator和\\ 的区别
- jeesite中集成Swagger2 三步
- 产品测试工装的研发回忆录
- java性能优化笔记(三)java程序优化
- webstorm 2017 激活破解
- Spring MVC 和 Spring 总结
- linux和c的行分隔符
- 欢迎使用CSDN-markdown编辑器
- libiconv安装
- Python高效编程-快速找出多个字典中的公有键
- 算法题练习系列之(三十九):星际密码
- svn--4.常用操作
- CentOS7添加端口访问
- 机器学习算法实践-树回归-转
- html编码