java socket编程中readline问题
2016-09-29 11:56
253 查看
Java socket编程时,常使用BufferedReader的readLine()函数来进行数据的读取。
但是该函数是阻塞的,如果在接收的数据中不含有'\n','\r'或者结束符时,往往导致进程挂起,从而程序无法继续。
所以在发送数据的另一端,一定要记得在最后加换行符。
readline只有读取文件等的结尾才会是null
在网络上(都是阻塞模式),readline是一直等待输入,
即使是对方什么也不输入,只是回车,readline也不会返回null
在I/O阻塞模式下,你写的条件循环while((line = in.readLine()) != null)是不合理的。
两种方法解决:
(1)双方约定每次发送报文都报文前几个字符表示长度信息,如下
原始报文是:ASDF
发送的socket报文是:0004ASDF
其中0004表示报文长度,接收方先接收四位的长度,再接收余下的报文。
(2)双方约定一个特殊的标志是结束符,比如约定 ==END== 表示结束
代码修改为while(!"==END==".equals(line = in.readLine()))就继续等待接收
这个特殊的结束符需要双方发送报文结束必须再发送的。
原文地址:http://blog.csdn.net/shenzhenyuyuyu/article/details/21088367
但是该函数是阻塞的,如果在接收的数据中不含有'\n','\r'或者结束符时,往往导致进程挂起,从而程序无法继续。
所以在发送数据的另一端,一定要记得在最后加换行符。
readline只有读取文件等的结尾才会是null
在网络上(都是阻塞模式),readline是一直等待输入,
即使是对方什么也不输入,只是回车,readline也不会返回null
在I/O阻塞模式下,你写的条件循环while((line = in.readLine()) != null)是不合理的。
两种方法解决:
(1)双方约定每次发送报文都报文前几个字符表示长度信息,如下
原始报文是:ASDF
发送的socket报文是:0004ASDF
其中0004表示报文长度,接收方先接收四位的长度,再接收余下的报文。
(2)双方约定一个特殊的标志是结束符,比如约定 ==END== 表示结束
代码修改为while(!"==END==".equals(line = in.readLine()))就继续等待接收
这个特殊的结束符需要双方发送报文结束必须再发送的。
原文地址:http://blog.csdn.net/shenzhenyuyuyu/article/details/21088367
相关文章推荐
- JAVA Socket 编程的两个问题,readline(),判断Socket连接断掉
- JAVA socket编程(使用BufferedReader的readline()函数读取最后一行等待20S)
- 关于socket编程的一个常坑问题,readLine()
- Java Socket编程及遇到的一些问题
- Java Socket常见异常处理 和 网络编程需要注意的问题
- Java socket 网络编程:BufferedReader readline 阻塞
- Java mina socket编程时readLine()阻塞问题
- Java Socket编程readLine返回null,read返回-1的条件
- java socket编程中的一些问题
- window编程问题
- 转:Java 编程技术中汉字问题的分析及解决
- 金山软件论坛 - 综合交流区 - 系统+软件+编程 - 『网友常见问题及解答』
- QT安装及编程的一些问题
- 使用 ASP.NET 以编程方式检查规范化问题
- Java 编程技术中汉字问题的一些url收藏
- Java 编程技术中汉字问题的分析及解决
- <<产生式编程方法,工具与应用>>问题
- 怎么才是喜欢编程(18问题)------转载自http://www.vchelp.net
- WINDOWS编程入门一个初级问题的分析
- 非COM环境下的接口编程--问题,技巧,应用(二)