7

我编写了一个使用 Java NIO API 执行非阻塞 IO 的服务器。我看到一种情况,有时客户端应用程序突然关闭(例如,由于断电)并且连接在服务器端保持打开状态。

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

IOException一些附加信息:如果在尝试读/写操作时捕获到一个键,我当前的服务器设计将取消一个键并关闭相应的通道。这种方法似乎在 99% 的时间内都有效;我只见过少数几种连接似乎处于打开状态的情况。

4

1 回答 1

6

如果没有应用级别的心跳,您唯一的选择就是依赖 TCP keepalive。但默认间隔很长(如 2 小时)。RFC 不建议间隔短于 2 小时。

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

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

于 2009-09-30T14:45:11.657 回答