4

ソケットプログラムを書きたい...

Socket socket = new Socket("127.0.0.1",12345);
DataOutputStream output = new DataOutputStream( socket.getOutputStream() );
output.writeUTF("Hello");
output.writeUTF("World");
 ...
 ...

「Hello」、「World」…どちらの文字列が先に届く?ソケットは順序を保証しましたか?

4

1 に答える 1

8

TCP プロトコルは、すべてのメッセージが完全に順序通りに送信されることを保証します。したがって、「World」は常に「Hello」の後に到着するという前提に頼ることができます。「Hello」パケットが何らかの理由で失われた場合、「Hello」パケットが再度要求されている間、他のアプリケーションへの「World」パケットの配信が遅延します。

これは、関連するホストのオペレーティング システムのネットワーク スタックによって自動的に処理されます。アプリケーション プログラマーは、そのために何もする必要はありません。

TCP プロトコルの仕組みの詳細については、それに関するウィキペディアの記事をお勧めします。

一方、UDP ソケットを使用する場合は状況が異なります。UDP はシーケンスまたは信頼性を保証しないため、1 つのパケットが他のパケットを追い越す可能性があります (そのため、ユーザーは「Hello」の前に「World」を受信します)、または一方が失われる可能性もあります (ユーザーは「Hello」または「Hello」のみを受信します)。 「世界」のみ)。

ただし、標準のSocketクラスはデフォルトで TCP を使用します。これは、コンストラクターtrueで 3 番目のパラメーター (非推奨) として渡して UDP を使用するように指示するか、UDP を使用する静的メソッドSocket.setSocketImplFactoryにカスタム ソケット実装を渡したときにオーバーライドできます (これは正気ではありません。このメソッドの目的は、UDP でも TCP でもないエキゾチックなトランスポート層プロトコルを実装することです)。

通常、UDP ソケットはクラスDatagramSocketによって表されます。

于 2013-03-18T16:08:41.687 に答える