我的连接应该每两分钟收到一次心跳。
但是,有时会发生某些情况,并且网络会损坏。由于某些原因,Solaris认为该连接仍然有效,因此不会在本地引发IOException,而在远程会引发IOException。
我已经在套接字上设置了超时,当从Windows XP测试环境中调试时,我们可以确认在两分十秒之后,套接字将按预期超时。
我没有背诵要引起异常的任何神奇的颂歌吗?
public void run() {
this.connect();
while (true) {
try {
InputStreamReader reader = new InputStreamReader(this.socket.getInputStream());
OutputStreamWriter writer = new OutputStreamWriter(this.socket.getOutputStream(), "ISO-8859-1");
for (int errorCount = 0; errorCount < 15;) {
if (!this.readResponse(reader, writer)) {
errorCount++;
}
}
this.logger.error("read incomplete message for 15 times, reset the connection");
} catch (Exception e) {
this.logger.error("read response error", e);
} finally {
this.reconnect();
}
}
}
哪里
private boolean readResponse(InputStreamReader reader, OutputStreamWriter writer) throws IOException {
int length = 0;
for (int i = 0; i < 2; i++) {
int ch = reader.read();
if (ch < 0) {
this.logger.error("read response buffer length error");
return false;
}
length = length * 256 + ch;
}
return true;
}
是readResponse方法的开始。
该方法阻塞int ch = reader.read();如我所料,在readResponse中,但是从未引发SocketTimeoutException。
有任何想法吗?
该代码在所有情况下均有效,超时除外。
谢谢你的帮助。
最佳答案
我想知道您是否可以采取以下措施:
if (reader.ready()) { int ch = reader.read(); }
在调用该方法之间可能有短暂的超时休眠。