2013-07-31 92 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