1

我无法从 java 文档中清楚地理解这一点。

考虑我SocketChannel在非阻塞模式下有一个可选通道 ( )。

如果我调用channel.connect(),它返回 false ,然后我使用选择器注册通道select(),如果连接实际上在 select() 被首次调用之前完成,甚至在注册完成了吗?

事件的顺序是:

  • connect(返回false
  • 不知何故,此时套接字变得“已连接”
  • register(返回选择键)
  • select(在不同的线程上完成,但保证在之后register

这也适用于其他操作。一般来说,当通道注册与该通道上完成的最后一次操作相关时是否重要,或者选择键是否会接收自最后一次通道操作以来发生的所有未完成事件?

4

1 回答 1

0

根据SocketChannel的Javadoc :

套接字通道支持非阻塞连接:可以创建一个套接字通道,并且可以通过 connect 方法启动建立到远程套接字的链接的过程,以便稍后通过 finishConnect 方法完成。可以通过调用 isConnectionPending 方法来确定连接操作是否正在进行。

此外,SocketChannel.connect()的文档指出:

如果连接立即建立,就像本地连接一样,则此方法返回 true。否则此方法返回 false 并且稍后必须通过调用 finishConnect 方法来完成连接操作

所以事件的顺序应该是:

  • channel.connect() - 返回 false
  • 通道.注册()
  • 选择器.select()
  • 选择频道后,调用 channel.finishConnect()
  • 如果 finishConnect() 返回 true,则取消注册 OP_CONNECT 的通道

所以是的,选择器将确保此套接字通道的选择被放置在其为 OP_CONNECT 准备好的集合中

于 2013-11-03T00:39:08.283 回答