我正在将一个使用阻塞 IO 和每个客户端线程的 Java 服务器应用程序转换为 NIO 和单个 IO 线程(在完成基本实现后可能是一个线程池)。我遇到的问题是在客户端闲置一段时间后断开连接。
我之前一直使用 SO_TIMEOUT 并阻止读取。然而,使用基于选择器的 IO,读取不会阻塞...我希望能够设置超时并能够在读取超时时进行选择,使用诸如 SelectionKey.isReadTimeout() 之类的东西,但没有像这样的这似乎是存在的。
我目前提出的最佳解决方案是为每个等待读取的 channel 配备一个带有 TimerTask 的计时器,然后在发生读取时取消并重新安排。有更好的解决办法吗?
最佳答案
我只是想看看我是如何在大约一年前编写的一段代码中处理这个问题的。这是我第一次玩 nio 的东西(实际上也是最后一次……从那以后我就离开了 Java)。我不知道这是否是完美的解决方案但是......
每当我从套接字读取数据时,我都会将当前时间存储在 SelectionKey.attachment()
中存储的对象中。我会定期遍历 SelectionKeys,检查时间,并排除任何超过特定时间的空闲键。
关于java - 有什么方法可以使用 Java NIO/选择器获得读取超时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2661022/