我正在实现一个简单的客户端/服务器读取器,我使用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 );
}
它能够读取消息,但不能突破循环,因为最后一次调用不会返回。
套接字将阻塞,直到没有更多输入。 InputStream只是一个接口,确切的行为取决于它的提供者实现。在套接字上设置超时,以便在特定时间段内没有输入时抛出异常。
这是来自javadoc on Socket的引用,请注意它描述了从套接字读取的行为作为阻塞操作,直到达到超时:
public void setSoTimeout(int timeout) throws SocketException
使用指定的超时启用/禁用
SO_TIMEOUT
,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须> 0.超时为零被解释为无限超时。
解决方案:
除了检查-1这是好的。在套接字上设置超时,并确保在正确处理抛出时发生异常。