1

複数のクライアントから接続を受信する小さなサーバーアプリケーションがあります。クライアントは接続し、メッセージを送信して切断しますが、応答は返されません。

ServerSocketChannelを使用して接続をリッスンしています。セレクターを使用して新しい接続の通知を受け取ります。これが発生した場合、SocketChannelをセレクターに登録します。SelectionKey.OP_READ

いつ通知を受け取るかわからないのは、データを読み取ることができるということです。私のSocketChannelsはノンブロッキングモードです。channel.read(buffer)SocketChannelを呼び出してバイトバッファに読み込みます。読み取り用のjavadocから、ストリームの終わりを示す-1が得られるまで、これを繰り返し呼び出す必要があります。ただし、再度readを呼び出す前に、セレクターが再度通知するのを待つ必要があるかどうかはわかりません。あれは:

  • セレクターからデータが利用可能であることが通知されます。
  • 私は既読と呼びます
  • 次に、-1が返されるまでもう一度readを呼び出す必要がありますか、それともセレクターに通知させてからもう一度readを呼び出す必要があります。

どうもありがとう

4

1 に答える 1

3

読み取り用の javadoc から、ストリームの終了を示す -1 を取得するまで、これを繰り返し呼び出す必要があります。

そんなことは言わない。

ノンブロッキング モードの場合は、 -1または zeroが返されるまで読み取ることができます。ゼロが返された場合は、ソケット受信バッファーに保留中のデータがなくなるため、選択ループに戻る必要があります。-1 が返された場合は、完了、完了、終了、ソケット チャネルを閉じて、それに応じて続行します。

于 2012-07-18T10:39:20.857 に答える