日期:2014-05-20  浏览次数:20763 次

java的socket,readline接收字符串的问题
Socket s = new Socket("192.168.218.2", 58100);

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

String info = null;

while(!((info=br.readLine())==null)){
    System.out.println(info);
    }

以上是部分代码,主要是readLine这句,接收字符串的时候,最后一行接收不到,while之后的代码也没有执行,程序处于一个挂起的状态。我这边接收的是delphi服务端的字符串数据。

上网查了下资料,好像是说最后一行没有回车符,我在服务端加了回车符之后,还是跳不出循环。。。

请问如何解决?







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