【问题标题】:Read data from a client socket in Java从 Java 中的客户端套接字读取数据
【发布时间】:2012-07-08 14:28:48
【问题描述】:

我已经编写了从客户端套接字发送/接收数据的代码。发送数据步骤已成功完成,但是当我想从套接字读取数据时,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() 做什么(如果不是阻塞)?
  • 我尝试使用 read(byte[], int, int) 读取字节,但它再次阻塞。我很奇怪,为什么 read() 在没有数据时阻塞。跨度>

标签: java sockets


【解决方案1】:

那是因为readLine()函数是一个阻塞调用,所以它当然会阻塞。

为了更具建设性,对readLine() 等方法的调用应该在单独的线程中进行,这样阻塞调用就不会影响您的其余代码。从正在阅读的课程中,我建议创建一个线程来纯粹控制从套接字读取。

我会传递一个对创建类的引用,这样如果线程接收到信息,父类就可以使用它。

【讨论】:

    【解决方案2】:

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

    Have a look at the documentation.

    【讨论】:

    • 不一定有帮助。考虑只收到部分线路的情况。 ready() 将返回 true 但 readLine() 仍将阻塞。您只需要接受这会阻塞 I/O 并相应地进行编程。
    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多