我想知道对于一个特定类型的事件为SelectionKey(实际上它的频道)做什么意味着是否有一些明确的答案?
key.isAcceptable):是否意味着客户端已建立连接(发送SYN并且服务器已发出SYN + ACK)?我认为是这种情况,因为简单地绑定ServerSocketChannel并不会使它“可接受”(在测试中验证了这一点)
key.isReadable():这是否意味着套接字的接收缓冲区未满(当然包括空)?或者它是否意味着其接收缓冲区中有未读字节? (我假设它是第一个,因为即使key.isReadable()),channel.read()也可以等于0 - 但是再次肯定是一个'休眠'通道(一个是打开的,但是客户端没有发送数据)不会在选择器的selected-keyset中重复返回?
我猜测答案是'依赖于实现'
答案 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
,并且可能会写第一个请求,因为您是客户。