我的连接应该每两分钟收到一次心跳。

但是,有时会发生某些情况,并且网络会损坏。由于某些原因,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(); }


在调用该方法之间可能有短暂的超时休眠。

10-07 15:39