我正在尝试实现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,如果由于某种原因完全不感兴趣,可以将它们设置为零。

08-07 06:25