1

我想知道对于 SelectionKey(实际上是它的 Channel)为特定类型的事件“准备好”意味着什么,是否有明确的答案?

key.isAcceptable):是不是表示客户端已经建立了连接(发送了SYN,而服务器已经发出了SYN+ACK)?我相信情况就是这样,因为简单地绑定一个 ServerSocketChannel 并不能让它“可接受”(在测试中验证了这一点)

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

我猜答案是“依赖于实现”

4

1 回答 1

0

key.isAcceptable):是不是表示客户端已经建立了连接(发送了SYN,而服务器已经发出了SYN+ACK)?

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

key.isReadable():是不是说socket的接收缓冲区没有满(当然也包括空的)?

不。

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

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

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

不,它不能。

但话又说回来,选择器的选定键集中不会重复返回“休眠”通道(打开但客户端未发送数据的通道)?

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

你没有问,但是:

  • isWritable(): 表示套接字发送缓冲区中有空间。这几乎总是如此,这就是为什么您应该只OP_WRITE在确定不是这种情况时才注册,即在 awrite()返回零之后,并且应该立即取消注册 awrite()成功而不返回零。

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

于 2013-03-19T03:42:09.990 回答