2009-09-30 90 views
7

我已经编写了一个使用Java NIO API执行非阻塞IO的服务器。我发现偶尔客户端应用程序突然关闭(例如,由于断电)并且连接在服务器端保持打开状态。NIO - 检测已关闭的连接

一位同事遇到了同样的问题,并说他在线上使用心跳检测这种事情,但我希望有一个更简单的方法。有其他人遇到过这个问题吗?

一些额外的信息:我的当前服务器设计将取消一个密钥,并关闭相应的通道,如果它在尝试读取/写入操作时捕获到IOException。这种方法似乎在99%的时间内工作;我只看到了一些连接似乎处于打开状态的情况。

回答

6

没有应用程序级别的心跳,你唯一的选择就是依靠TCP keepalive。但默认时间间隔很长(如2小时)。 RFC建议不要超过2小时。

您可以缩短它,但这是一个系统范围的参数。在某些操作系统上,它甚至需要内核重建来改变它。

因此,强烈建议任何基于TCP协议的心跳。

+0

谢谢ZZ编码器 - 这就是我认为(担心)。我很惊讶这不是TCP的一个特性。 – Adamski 2009-09-30 15:02:24

+0

“平”而不是,这些应用程序不是人类 - 你知道。 – 2011-03-22 21:01:45