gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:54:08 25 4
gpt4 key购买 nike

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

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

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

这是使用的代码。连接似乎在 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. waitTimeBeforeSocketClose 为零,因此您将无限期阻塞,或者

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

一次读取一个字节的效果非常差。我不明白这有什么意义。

关于即使读取超时,Java Socket 也不会解除阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28565252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com