NIO:SelectionKey准备好了究竟是什么意思?

时间:2013-03-18 21:07:17

标签: selector nio

我想知道对于一个特定类型的事件为SelectionKey(实际上它的频道)做什么意味着是否有一些明确的答案?

key.isAcceptable):是否意味着客户端已建立连接(发送SYN并且服务器已发出SYN + ACK)?我认为是这种情况,因为简单地绑定ServerSocketChannel并不会使它“可接受”(在测试中验证了这一点)

key.isReadable():这是否意味着套接字的接收缓冲区未满(当然包括空)?或者它是否意味着其接收缓冲区中有未读字节? (我假设它是第一个,因为即使key.isReadable()),channel.read()也可以等于0 - 但是再次肯定是一个'休眠'通道(一个是打开的,但是客户端没有发送数据)不会在选择器的selected-keyset中重复返回?

我猜测答案是'依赖于实现'

1 个答案:

答案 0 :(得分:0)

  

key.isAcceptable):这是否意味着客户端已建立连接(发送SYN并且服务器已发出SYN + ACK)?;

这意味着至少有一个客户端已经这样做了。也许更多。所有这些客户都将坐在积压队列中。

  

key.isReadable():这是否意味着套接字的接收缓冲区未满(当然包括空)?

没有

  

或者是否意味着其接收缓冲区中有未读字节?

这意味着套接字接收缓冲区中有数据。当你阅读它时它会被删除,所以那里的所有数据都是“未读”。

  

(我认为它是第一个,因为即使key.isReadable()),channel.read()也可以等于0

不,不能。

  

但是再一次肯定是一个'休眠'频道(一个是开放的,但客户端没有发送数据的频道)不会在选择器的selected-keyset中重复返回?

当然不是。只有准备好读取数据的频道。

你没有问,但是:

  • isWritable():表示套接字发送缓冲区中有 room 。这种情况几乎总是如此,这就是为什么只有在明确知道不是这种情况时才应注册OP_WRITE,即在write()返回零之后,应该立即取消注册write()成功了,但没有返回零。

  • isConnectable():表示您在注册connect()的非阻止模式下调用了OP_CONNECT,现在应该调用finishConnect(),如果它返回{ {1}}您应该取消注册true,并且可能会写第一个请求,因为您是客户。