java - 有什么方法可以使用 Java NIO/选择器获得读取超时吗?

标签 java sockets timeout selector nio

我正在将一个使用阻塞 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/

相关文章:

java - 不使用 IDE 或命令提示符运行 Java 项目

java - 迷人且引人入胜的 Java 套接字多线程 fandango

c - 服务器接受许多客户端

c# - 如何等到控制台应用程序空闲?

javascript - 在闭包中调用 setTimeout 会导致内存泄漏吗?

java - DefaultMutableTreeNode-Text 太长?

java - 使 Jar 文件正确链接的问题。验证错误

r - 使用插入符号 : How to specify a timeout? 的机器学习

java - spring jms 全局 ErrorHandler 不工作

sockets - 可靠的多播库 C++