2009-04-01 5 views
3

SocketChannelを使用する場合、部分的な書き込みと読み取りを処理するために、読み書きバッファを保持する必要があります。NIO DatagramChannelを使用すると、部分的に読み書きされたパケットを処理する必要がありますか?

私は、DatagramChannelを使用する場合には必要ではないかもしれないという不満を抱いていますが、情報は不足しています。

話は何ですか?

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

非ブロックモードで送信する場合、send(ByteBuffer、SocketAddress)を使用してバッファ全体を送信するか、完全に拒否することができますか、部分的に書き込まれたバッファを保持する必要がありますか?

答えて

5

データグラムのすべての読み取りは、データグラム全体です。これはjava.nio.DatagramChannel.readの説明の場合であるというヒントがあります:

与え バッファに残っているよりも、 データグラム内の複数のバイトがある場合は、 データグラムの残りはさサイレント破棄

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

+0

何について書きますか?送信バッファがいっぱいになっているために部分書き込みが行われるのでしょうか、それともすべてかどうかの問題ですか? – Nuoji

+0

それはまた、すべてかどうかです。データグラムより大きなものを書くと、何が起こるかわかりませんが(例外?)、確かに送信されません。 1つのUDPデータグラムではほぼ64kです。 –

+0

もう1つのカップルノート:データグラムが相手側で配信される保証はありませんが、通常は配信されます。また、WindowsはネットワークのMTUを超えるブロードキャストUDPデータグラムを送信できないようですので、注意してください。 –

関連する問題