从选择器中删除密钥
问题描述:
我正试图实施NIO服务器并且有一个关于SelectionKey
的问题。假设我们提取了一些准备好读取的密钥。就像这样:从选择器中删除密钥
SelectionKey key;
//...
SocketChannel c = (SocketChannel) key.channel;
//read from c
但是我们从通道读取的是不足以使一个完整的Packet
。所以我附加了一些对象到key
。
问:什么时候应该从Selector
中删除key
?当我读完整Packet
?或者每当我重新注册频道时,请删除Selector
中的密钥,并将接收到的数据重新附加到新注册的SelectionKey
?
答
什么时候应该从选择器中删除密钥?
当您不再对其Channel
中的事件感兴趣时。这很少见。大多数情况下,您只需关闭Channel
即可自动取消SelectionKey
。
当我阅读完整的数据包?
不,为什么?
或者每次我要重新注册通道时,删除选择
没有钥匙,为什么呢?如果您有兴趣阅读该频道的活动,为什么您的兴趣会停止,直到您关闭Channel
?除了您正在对该频道写短文的情况之外,在这种情况下,您应该停止有兴趣阅读该文件:但您可以通过如下操作interestOps
来完成此操作。
并重新附加接收到新注册的SelectionKey的数据?
我不知道这是什么意思。真的没有理由为现有频道注册新的SelectionKey
。只是玩弄其interestOps
,如果你出于某种原因不感兴趣,可能将其设置为零。