即使读取超时,Java Socket也不会解除阻塞

时间:2015-02-17 15:42:09

标签: java sockets

我有一个应用程序通过套接字写入请求数据并读取响应。

有时候主机不会响应请求和我的代码阻止,即使我使用了读取超时。

无法手动清除它,它需要重新启动系统或重新启动所需的服务器处理程序。

这是使用的代码。连接似乎在objBufferedInputStream.read(..)

处阻止
Socket clientSocket = new Socket(objInetAddress, hostPort);
clientSocket.setKeepAlive(true);
clientSocket.setReceiveBufferSize(8192);
clientSocket.setSendBufferSize(8192);
clientSocket.setSoTimeout(waitTimeBeforeSocketClose * 1000);
objBufferedInputStream = new BufferedInputStream(clientSocket
                    .getInputStream());
.......
objBufferedOutputStream.write(message, 0, message.length);
objBufferedOutputStream.flush();

while (bytesLeft > 0 && bytesread > -1) {
        try {
            bytesread = objBufferedInputStream.read(data, 4096 - bytesLeft, 1);             
        } catch (IOException e) {
            objLogger.writeException(e);
            try {
                objBufferedInputStream.close();
            } catch (IOException e1) {
                objLogger.writeException(e1);

                return null;
            }
            return null;
        }
        bytesLeft -= bytesread;
    }
    return data;

}

如果主持人没有回应或保留回复,请告知这是否属于预期行为。

请告知是否有替代方法。

1 个答案:

答案 0 :(得分:1)

或者:

  1. waitTimeBeforeSocketClose为零,因此您无限期阻止,或

  2. 它不是零,所以你在循环中得到SocketTimeoutException并忽略它,所以你永远旋转。为SocketTimeoutException添加一个单独的catch块,其中包含break;从不只是忽略IOException.在这种情况下,我会说你应该退出任何IOException,上的循环,这样你也可以考虑将try / catch放在循环之外。

  3. 一次读取一个字节非常差。我没有看到这一点。