1

Javaのドキュメントからこれを明確に理解できませんでした。

SocketChannelノンブロッキング モードの選択可能なチャネル ( ) があるとします。

を呼び出しchannel.connect()て false を返し、チャネルをセレクターに登録するとselect()、select() が最初に呼び出される前、または select() が最初に呼び出される前、または登録はされましたか?

イベントの順序は次のとおりです。

  • connect(リターンfalse)
  • どういうわけかソケットはこの時点で「接続済み」になります
  • register(選択キーを返す)
  • select(別のスレッドで実行されますが、後で保証されますregister)

これは他の操作にも当てはまります。一般に、そのチャネルで行われた最後の操作に関連してチャネルが登録される時期は重要ですか、それとも最後のチャネル操作以降に発生したすべての未解決のイベントを選択キーが受け取るのでしょうか?

4

1 に答える 1

0

SocketChannelのJavadocによると:

ソケット チャネルはノンブロッキング接続をサポートします。ソケット チャネルを作成し、connect メソッドを介してリモート ソケットへのリンクを確立するプロセスを開始し、finishConnect メソッドで後で完了することができます。接続操作が進行中かどうかは、isConnectionPending メソッドを呼び出すことで判断できます。

さらに、SocketChannel.connect()のドキュメントには次のように記載されています。

ローカル接続で発生する可能性があるように、接続がすぐに確立された場合、このメソッドは true を返します。それ以外の場合、このメソッドは false を返し、finishConnect メソッドを呼び出して接続操作を後で完了する必要があります。

したがって、一連のイベントは次のようになります。

  • channel.connect() - false を返す
  • channel.register()
  • セレクター.select()
  • チャンネルが選択されたら、channel.finishConnect() を呼び出します
  • finishConnect() が true を返した場合、OP_CONNECT のチャネルを登録解除します

そうです、セレクターは、このソケットチャネルの選択が OP_CONNECT の準備完了セットに配置されるようにします

于 2013-11-03T00:39:08.283 に答える