Java DataInputStream读取不返回

问题描述 投票:1回答:1

我正在实现一个简单的客户端/服务器读取器,我使用DataInputStream将所有内容读取为字节,然后再处理解析。

这是我的阅读代码:

String line;
String requestString = "";

//client is a Socket that is initialized elsewhere
DataInputStream inputData = new DataInputStream(client.getInputStream());
byte [] messageByte = new byte[1024];
int counter = 0;
  while(true) {  
    int bytesRead = inputData.read(messageByte, counter, 1024-counter);
    counter = (counter + bytesRead)%1024;
    if(bytesRead == -1) {
      System.out.println("Breaking out of loop");
      break;
    }
    line = new String(messageByte, 0, bytesRead);
    System.out.println( "GOT > " + line );
  }

它能够读取消息,但不能突破循环,因为最后一次调用不会返回。

java sockets inputstream blocking
1个回答
1
投票

套接字将阻塞,直到没有更多输入。 InputStream只是一个接口,确切的行为取决于它的提供者实现。在套接字上设置超时,以便在特定时间段内没有输入时抛出异常。

这是来自javadoc on Socket的引用,请注意它描述了从套接字读取的行为作为阻塞操作,直到达到超时:

public void setSoTimeout(int timeout)
                  throws SocketException

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须> 0.超时为零被解释为无限超时。

解决方案:

除了检查-1这是好的。在套接字上设置超时,并确保在正确处理抛出时发生异常。

© www.soinside.com 2019 - 2024. All rights reserved.