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によって表されます。