我有一个连接,应该每两分钟接收一次心跳。
然而偶尔会发生一些事情并且网络变坏了。出于某种原因,Solaris认为连接仍然存在,在本地不会引发IOException,但是远程引发了一个。
我在套接字上设置了超时,当从Windows XP测试环境调试时,我们可以确认在2分10秒后套接字按预期超时。
是否有任何神奇的颂歌,我没有背诵,我需要提出异常才能提出异常?
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。
任何想法?
除了超时外,代码适用于所有情况。
感谢您的帮助。
答案 0 :(得分:0)
我想知道你是否可以做一些事情:
if (reader.ready()) { int ch = reader.read(); }
也许在该方法的调用之间暂停一段时间。
答案 1 :(得分:0)
查看http://bugs.sun.com/view_bug.do?bug_id=6596323并查看它是否解决了您的问题