1

SelectionKey (実際にはそのチャネル) が特定の種類のイベントに対して「準備ができている」ことの意味に対する決定的な答えがあるかどうか疑問に思っていましたか?

key.isAcceptable): クライアントが接続を確立した (SYN を送信し、サーバーが SYN + ACK を発行した) ことを意味しますか?; ServerSocketChannel をバインドするだけでは「受け入れられる」わけではないため、そうであると思います(テストでこれを確認しました)

key.isReadable(): ソケットの受信バッファがいっぱいではないということですか (もちろん空も含まれます)? それとも、受信バッファに未読バイトがあるということですか? (key.isReadable() の場合でも channel.read() は 0 になる可能性があるので、これが最初だと思います) - しかし、やはり確かに「休眠状態」のチャネル (開いているがクライアントがデータを送信していないチャネル) です。セレクターの選択されたキーセットで繰り返し返されませんか?

答えは「実装依存」だと思います

4

1 に答える 1

0

key.isAcceptable): クライアントが接続を確立した (SYN を送信し、サーバーが SYN + ACK を発行した) ことを意味しますか?;

これは、少なくとも 1 つのクライアントがそれを行ったことを意味します。おそらくもっとある。そのようなクライアントはすべて、バックログ キューに置かれます。

key.isReadable(): ソケットの受信バッファがいっぱいではないということですか (もちろん空も含まれます)?

いいえ。

それとも、受信バッファに未読バイトがあるということですか?

これは、ソケット受信バッファにデータがあることを意味します。読むと削除されるので、そこにあるすべてのデータは「未読」です。

(key.isReadable() の場合でも channel.read() は 0 になる可能性があるので、これが最初だと思います)

いいえ、できません。

しかし、再び確かに「休眠」チャネル (開いているがクライアントがデータを送信していないチャネル) は、セレクターの選択されたキーセットで繰り返し返されませんか?

もちろん違います。データを読み取る準備ができているチャネルのみ。

あなたは尋ねませんでしたが:

  • isWritable():ソケット送信バッファに余裕があることを意味します。これはほとんどの場合に当てはまります。OP_WRITEそのため、そうでないことが明確にわかっている場合にのみ登録する必要があります。つまり、a が 0 を返した後、 0 を返さずに成功しwrite()た場合はすぐに登録を解除する必要があります。write()

  • isConnectable(): は、登録済みconnect()のノンブロッキング モードで呼び出したことを意味します。ここで を呼び出す必要があります。返された場合は、登録を解除し、おそらく最初の要求を作成する必要があります。これは、クライアントであるためです。OP_CONNECTfinishConnect()trueOP_CONNECT

于 2013-03-19T03:42:09.990 に答える