12

我正在使用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方法会阻塞呢?服务器通常如何发出到达流结束的信号?谢谢。

4

4 回答 4

12

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

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

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

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

于 2011-05-26T14:10:20.040 回答
4

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

于 2011-05-26T14:09:31.187 回答
2

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

于 2013-10-23T09:22:34.107 回答
0

如果不使用空行,则可以扩展 while 条件:

while((line = br.readLine())!=null && line.length() > 0) {
   // ...
}
于 2014-01-03T16:44:50.967 回答