Solaris 9上的SocketTimeoutException未被抛出

时间:2009-10-06 17:31:35

标签: java debugging sockets solaris

我有一个连接,应该每两分钟接收一次心跳。

然而偶尔会发生一些事情并且网络变坏了。出于某种原因,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。

任何想法?

除了超时外,代码适用于所有情况。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我想知道你是否可以做一些事情:

if (reader.ready()) { int ch = reader.read(); } 

也许在该方法的调用之间暂停一段时间。

答案 1 :(得分:0)

查看http://bugs.sun.com/view_bug.do?bug_id=6596323并查看它是否解决了您的问题