java - 套接字:BufferedReader readLine() block

标签 java sockets bufferedreader java-io

我正在使用 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”的最后一个字符时,将读取该行并再次开始循环,等待下一行。

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

为了停止循环,你必须在某处手动关闭连接或者等待超时。但是,如果没有关于您的通信协议(protocol)的更多信息,就不可能对此更加精确。

关于java - 套接字:BufferedReader readLine() block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139834/

相关文章:

c - 仅为 recv 设置超时

c - 套接字在 linux 上工作但在 osx 上不工作

Java 将多个图像合并为一个更大的图像而不重叠

java - IO 与数据库 : Which is faster?

java - 如何在java中读取文本文件的第一行并打印出来?

java - Collections 类中的方法没有对输入集合进行空检查

java - SWIG 结构成员被 Java 的垃圾收集器过早释放

java - 多线程服务器客户端地址已被使用

java - BufferReader.skip()性能

java - java中是否有任何方法与Visual C++中的ReadInt16()具有相同的功能