我正在尝试实现NIO服务器,并对SelectionKey
有疑问。假设我们提取了一些可供读取的密钥。像这样:
SelectionKey key;
//...
SocketChannel c = (SocketChannel) key.channel;
//read from c
但是,我们从通道中读取的内容不足以构成完整的
Packet
。因此,我将一些对象附加到key
。问题:什么时候应该从
key
删除Selector
?当我阅读完整的Packet
时?还是每次我重新注册频道时,都从Selector
删除密钥,然后将接收到的数据重新附加到新注册的SelectionKey
上? 最佳答案
什么时候应该从选择器中删除密钥?
当您不再对其Channel
中的事件感兴趣时。这是罕见的。通常,您只需关闭Channel
,它会自动取消SelectionKey
。
我何时阅读完整的数据包?
没有为什么?
或每当我重新注册频道时,从选择器中删除密钥
没有为什么?如果您对频道中的读取事件感兴趣,为什么在关闭Channel
之前,这种兴趣会停止?除了您对该频道进行简短写入的情况外,在这种情况下,您当然应该对阅读它不感兴趣:但是您可以通过如下操作interestOps
来做到这一点。
并将接收到的数据重新附加到新注册的SelectionKey上?
我不知道这是什么意思。确实没有理由为现有频道注册新的SelectionKey
。只需试一下它的interestOps
,如果由于某种原因完全不感兴趣,可以将它们设置为零。