套接字:BufferedReader readLine()块

我正在使用BufferedReader.readLine()方法从远程服务器读取响应(用C语言编写,我无法访问源代码)。

 BufferedReader br = new BufferedReader(new InputStreamReader(in)); String line; while((line = br.readLine())!=null){ [...] } 

但它总是阻塞在最后一行,直到它超时。 所以我使用了以下代码:

 int b; while(true){ b = in.read; [...] } 

我发现读取的最后一个字节的整数值为13,我认为这是一个回车,对吗?

那么为什么readLine方法会阻塞? 服务器通常如何发出信号流的结束信号? 谢谢。

在网络连接的情况下,当套接字关闭时终止流。

因此, readLine()阻塞直到它收到“行尾”或手动关闭连接是完全正常的。 当readLine()收到带有’13’值的最后一个字符时,读取该行并再次开始循环,等待下一行。

“最后一行”与其他行没有区别。

要停止循环,必须手动关闭某处的连接或等待超时。 但是如果没有关于您的通信协议的更多信息,就不可能更准确地了解这一点。

这取决于协议。 如果服务器未关闭流,readLine将阻塞,直到收到正确的行结束。 因此,如果服务器从未发送正确的行结束,则会被阻止。 您应该使用更多低级方法并尝试获取协议文档,或对其进行反向工程。

确保服务器代码具有out.println()而不是out.print()

如果不使用空行,可以延长while条件:

 while((line = br.readLine())!=null && line.length() > 0) { // ... }