为什么设置SO_TIMEOUT会导致SocketInputStream的最终读取立即返回?

时间:2013-07-31 04:37:56

标签: java sockets java-io

我正在研究一种测试工具,它通过套接字将字节写入服务器并读取响应。我有一个问题,即最后一次读取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上的最终读取立即返回?

1 个答案:

答案 0 :(得分:1)

这听起来难以置信。设置套接字超时不应该有这种效果。

我认为最可能的解释是你更改了其他内容 是修复暂停的内容。 (如果我猜的话,那就是服务器现在正在关闭它之前没有这样做的套接字。)

如果这没有帮助,您需要提供其他人可以运行的SSCCE来观察效果。并告诉我们您正在使用的平台。