我有一个应用程序通过套接字写入请求数据并读取响应。
有时候主机不会响应请求和我的代码阻止,即使我使用了读取超时。
无法手动清除它,它需要重新启动系统或重新启动所需的服务器处理程序。
这是使用的代码。连接似乎在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;
}
如果主持人没有回应或保留回复,请告知这是否属于预期行为。
请告知是否有替代方法。
答案 0 :(得分:1)
或者:
waitTimeBeforeSocketClose
为零,因此您无限期阻止,或
它不是零,所以你在循环中得到SocketTimeoutException
并忽略它,所以你永远旋转。为SocketTimeoutException
添加一个单独的catch块,其中包含break;
。 从不只是忽略IOException.
在这种情况下,我会说你应该退出任何IOException,
上的循环,这样你也可以考虑将try / catch放在循环之外。
一次读取一个字节非常差。我没有看到这一点。