我正在研究一种测试工具,它通过套接字将字节写入服务器并读取响应。我有一个问题,即最后一次读取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上的最终读取立即返回?
答案 0 :(得分:1)
这听起来难以置信。设置套接字超时不应该有这种效果。
我认为最可能的解释是你更改了其他内容, 是修复暂停的内容。 (如果我猜的话,那就是服务器现在正在关闭它之前没有这样做的套接字。)
如果这没有帮助,您需要提供其他人可以运行的SSCCE来观察效果。并告诉我们您正在使用的平台。