在Java中从客户端socket读取数据

3

我已经编写了从客户端套接字发送/接收数据的代码。 发送数据步骤已成功完成,但是当我想要从套接字读取数据时,readLine()方法会在没有可读取的数据时阻止程序。

这是我的代码:

StringBuffer document = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null)
     document.append(line + "\n");
reader.close()

感谢大家。 我可以读取所有接收到的数据,但是当没有数据可读时,readLine或read(byte[], int, int)方法会阻塞程序,而此时这些方法必须返回null/-1。


你是否正在交换基于字符、基于行格式的数据? 如果没有足够的数据来构建下一行,你希望readLine()做什么(如果不阻塞)? - Pawel Veselov
我尝试使用read(byte[], int, int)读取字节,但它又被阻塞了。这对我来说很奇怪,为什么在没有数据的情况下read()会被阻塞。 - Majid
2个回答

5
那是因为readLine()函数是阻塞调用,所以它会阻塞。
更好的做法是,应该将像readLine()这样的方法调用放在单独的线程中,以便阻塞调用不会影响您代码的其余部分。我建议从读取数据的类中创建一个纯控制套接字读取的线程。
我会传递一个引用到创建类,以便如果线程收到信息,父类可以使用它。

-1

BufferedReader有一个名为'ready()'的方法,当数据准备好接收时返回true。如果您不想在'readLine()'调用时被阻塞,请先检查数据是否准备好读取。

请查看文档


不一定会有帮助。考虑只接收了行的一部分的情况。ready()将返回true,但readLine()仍将阻塞。你必须接受这是阻塞I/O并相应地编程。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接