java - 在 selector.select() 中检测 ServerSocketChannel 何时关闭

标签 java nio socketchannel

当我将 selector.select() 注册到 SocketChannel 并在单独的线程中关闭 SocketChannel 的对等体时,selector.select() 返回,并且设置了该 channel 的 READ 操作。如果我有一个 ServerSocketChannel 注册到选择器,并且我关闭了 ServerSocketChannel,selector.select() 不会返回。无论如何我可以检测到 ServerSocketChannel 在 selector.select() 中被阻止时已关闭?

我尝试使用 selector.wakeup() 并遍历键集(不是选定的键),并查看该组中是否有任何未打开的 channel ,但是一旦在 ServerSocketChannel 上完成关闭,它从选择器中注销,因此它不在 select.keys() 集合中。

最佳答案

Is there anyway i can detect that the ServerSocketChannel was closed while being blocked in selector.select()?

如果您希望 selector.select() 返回,以便您可以在选定的键中提取关闭的 channel ,则否。正如文档所说

It returns only after at least one channel is selected, this selector's wakeup method is invoked, or the current thread is interrupted, whichever comes first.

因为没有OP_CLOSE这样的兴趣操作,所以让select方法在 channel 关闭时返回的唯一方法是唤醒 明确。但是 key 被隐式取消。

无论如何,对于封闭的 channel ,您无能为力。

此外,EPollSelectorProvider 正在代理对底层 epoll 的调用,它也没有您想要的事件。 http://man7.org/linux/man-pages/man2/epoll_ctl.2.html

关于java - 在 selector.select() 中检测 ServerSocketChannel 何时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54794273/

相关文章:

java - 如何在 OpenShift 上启动与 JDBC 的连接?

java - 在 Gradle 中调试 Github Packages 存储库连接

java - 在Java中检测远程文件

java - Files.newDirectoryStream 与 Files.list

java - NIO连接断开时未获取readyKey

java - 属性 'profile' 不允许出现在元素 'beans:bean' 中

java - 如何确保客户端崩溃时 JMS 消息重新传递

android - 如何在 Java 代码中使用 Kotlin 协程实现 NIO Socket(客户端)?

java - NIO 聊天应用程序无法为多个客户端正常工作

Java NIO。 SocketChannel.read方法每次都返回0。为什么?