2011-05-26 98 views
12

我正在使用BufferedReader.readLine()方法来读取来自远程服务器(用C编写且我无法访问源代码)的响应。插槽:BufferedReader readLine()块

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

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

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

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

那么为什么readLine方法阻止?服务器如何通常表示流达到了终点?谢谢。

+0

能否请您粘贴你使用的非阻塞代码。我期待看到可以为非阻塞输入做些什么 – 2017-02-11 08:16:42

回答

12

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

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

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

为了停止循环,您必须在某处手动关闭连接或等待超时。但是,如果没有关于您的通信协议的更多信息,则无法对此做出更精确的描述。

+0

你是对的;代码将等待\ r,然后记住跳过下一个换行符(如果有的话)。 – 2011-05-26 14:26:45

4

这取决于协议。如果服务器未关闭流,则readLine将阻塞,直到收到适当的行结束为止。所以如果服务器从不发送适当的行结束,你就被阻止了。你也许应该使用更多的低级方法,并尝试获取协议文档,或者对其进行反向工程。

1

确保该服务器代码通过out.println()代替的out.print()

1

您可以扩展状态时,如果你不使用空行:

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

是的,正确的想法。你可以做的另一件事是使用消息结尾的特殊字符序列。声明类似'EOM'= \ n \ n其中'EOM'是EndOfMessage – BQuadra 2014-01-09 11:53:26

+0

除readLine将阻塞,直到检测到行结束或流关闭。 – 2017-11-10 19:50:37

相关问题