3

SocketChannel を使用する場合、部分的な書き込みと読み取りを処理するために、読み取りバッファーと書き込みバッファーを保持する必要があります。

DatagramChannel を使用する場合は必要ないのではないかと疑っていますが、情報が不足しています。

話は何ですか?

待機中のすべてのデータグラムを読み取るために null が返されるまで、(ノンブロッキング) receive(ByteBuffer) を繰り返し呼び出す必要がありますか?

ノンブロッキング モードで送信する場合、send(ByteBuffer, SocketAddress) に依存して、バッファ全体を送信するか、完全に拒否できますか? それとも、部分的に書き込まれたバッファを保持する必要がありますか?

4

1 に答える 1

5

データグラムのすべての読み取りはデータグラム全体であり、それ以上でもそれ以下でもありません。java.nio.DatagramChannel.read の説明に、これが当てはまるというヒントがあります。

指定されたバッファに残っているよりも多くのバイトがデータグラム内にある場合、データグラムの残りは静かに破棄されます

SocketChannel を扱う場合、それはメッセージ ストリームです。TCP は別のパケットを再構築して反対側からのメッセージを再作成しているため、各読み取りで取得するデータの量または量の保証はありません。しかし、UDP (DatagramChannel で読み取っているもの) の場合、各パケットは独自のアトミック メッセージです。

于 2009-04-01T21:25:48.870 に答える