2013-07-31 57 views
1

是否可以取消注册,然后再次使用同一个选择器注册? 我必须限制我接受的连接数量,并执行key.cancel()来停止接收OP_ACCEPT事件。在java中取消注册并重新注册NIO

server.register(selector, SelectionKey.OP_ACCEPT); 
... 
key.cancel() 
... 

如果连接被关闭,我不能再次运行寄存器(..),得到一个 java.nio.channels.CancelledKeyException

Javadoc文档寄存器(..):如果该通道的CancelledKeyException扔目前已注册给定的选择器,但相应的密钥已被取消

实现我想要做什么的方法是?

+0

你能告诉我们更多你的代码吗?这听起来像是你忘记重新注册你的频道。 – Jeffrey

回答

1

只需清除密钥的interestOps中要清除的位:例如key.interestOps(0)

+0

这就是我最终做的事情,是否有一种方法可以关闭它,并且在没有关闭当前接受的连接的情况下连接尝试以“连接被拒绝”结束? – lleclerc

+0

当然,只需关闭ServerSocket/ServerSocketChannel即可。它不影响已经接受的连接。 – EJP