我使用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
方法会阻塞?服务器通常如何发出信号流结束信号?感谢。
答案 0 :(得分:12)
如果是网络连接,则在套接字关闭时终止流。
因此readLine()
阻塞直到收到“行尾”或手动关闭连接是完全正常的。当您的readLine()
收到带有“13”值的最后一个字符时,将读取该行并再次开始循环,等待下一行。
“最后一行”与其他行没有区别。
要停止循环,您必须手动关闭某处的连接或等待超时。但是如果没有关于您的通信协议的更多信息,就不可能更准确地说明这一点。
答案 1 :(得分:4)
这取决于协议。如果服务器未关闭流,readLine将阻塞,直到收到正确的行结束。因此,如果服务器从未发送正确的行结束,则会被阻止。您应该使用更多低级方法并尝试获取协议文档或对其进行反向工程。
答案 2 :(得分:2)
确保服务器代码具有out.println()而不是out.print()
答案 3 :(得分:1)
如果不使用空行,则可以延长while条件:
while((line = br.readLine())!=null && line.length() > 0) {
// ...
}