我正在开发一个测试工具,该工具通过套接字将字节写入服务器并读取响应。我遇到了一个问题,即最后一次读取 Socket 的 InputStream 会暂停 20 秒。我解决了这个问题,但不明白为什么它会起作用。
下面的方法给出了一个 java.net.SocketInputStream。对read(byte[], int, int)的调用在最后一次读取时暂停了 20 秒,返回 -1,表示流结束。
private String getResponse(InputStream in) throws IOException {
StringBuffer buffer = new StringBuffer();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int bytesRead = 0;
while (bytesRead >= 0) {
bytesRead = in.read(data, 0, 1024); // PAUSED HERE ON LAST READ
if (bytesRead > 0) {
bout.write(data, 0, bytesRead);
}
buffer.append(new String(data));
}
return buffer.toString();
}
通过在套接字上设置 SO_TIMEOUT,我能够使暂停消失。我设置它似乎并不重要。即使使用 socket.setSoTimeout(60000),在上述方法中读取的问题也会在流结束时立即返回。
这里发生了什么事?为什么设置 SO_TIMEOUT,即使设置为高值,也会导致对 SocketInputStream 的最终读取立即返回?