Java socket编程时readLine()问题

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()))就继续等待接收
这个特殊的结束符需要双方发送报文结束必须再发送的。

这里我在补充一种自己方法:你可以自己去封装  in.readline()这个方法

public String getContent(){
  try{
return br.readLine();
}
catch(IOException e){
...
}
return null;
}
我做个一个android连接pc的一个小实验就是这样的,一旦连接异常,自然就返回null,服务端就可以正常运行了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值