1

皆さん、こんにちは!

Java NIO に基づいて単純な Java UDP サーバーを開発しています。ここで、すべての着信メッセージを何らかのバッファーに格納し、何らかの形で改行を認識しなければならないことを読みました。しかし、着信メッセージのサイズが常に <= バッファー サイズの場合、以前の状態を保存する必要がありますか? 私の ByteBuffer は、着信メッセージを保存するのに十分な大きさです。大きなメッセージの一部にすぎないのに、monolit のようなメッセージを処理しないようにした方がよい場合はありますか? 私はオーバーヘッドの仕事をしたくないだけで、十分な大きさのバッファを危険な戦略に割り当てるかどうかを正確にしたいのです。

4

1 に答える 1

1

引用した質問は、使用している UDP チャネルとは異なる TCP チャネルに関するものです。

TCP はバイト指向です (つまり、TCP 層には「メッセージ」はありません。TCP は単一のバイト ストリームであり、ストリームを「メッセージ」に分割することはアプリケーションの問題です)。アプリケーションは、バイトストリームを処理してメッセージを抽出する必要があります。ホストは TCP チャネルにいくつかのバイトを書き込むことができ、その後さらにバイトを書き込みます。他のホストは、それらが 2 つ (またはそれ以上) の異なる操作で書き込まれたのか、1 つの操作で書き込まれたのかわかりません。他のホストは、送信されたのと同じ順序でバイトを読み取るだけです。

一方、UDP はデータグラム指向です。あるホストからいくつかのバイト (データグラム) を送信すると、他のホストがそのデータグラムを受信します。データグラムはマージも分割もされません (ただし、失われる可能性があります)。DatagramChannel.readは、正確に 1 つのデータグラムを返します。すべてのメッセージが UDP データグラムに収まる場合、バッファを保持する必要はありません。

ただし、複数の UDP データグラムで送信されるメッセージがある場合は、元のメッセージを再構築するためにバッファーが必要になります。また、メッセージの順序 (UDP データグラムはネットワークによって並べ替えられる可能性があるため) とデータグラムの欠落 (UDP は信頼できないため)にも注意する必要があります。

于 2013-03-15T04:31:05.597 に答える