0

チャット アプリケーションを実装しようとしていますが、ピア間のメッセージング交換に TCP または UDP を使用する設計上の選択があります。TCP を使用したいのですが、次の問題があります。

問題のシナリオ: ピア A は既知のポート (5555 など) でリッスンしています。ピア B がピア A にメッセージを送信する場合、ピア A のポート 5555 に接続します。ピア A は接続を受け入れ、新しいスレッドを開始してピア B との通信を処理します。これにより、他のピア (ピア C など) がピア A の 5555 ポートに接続します。問題は、要求/応答プロトコルではないことです。そのため、ピア A が何らかの理由でピア B に応答しない場合、B によって送信された後続のメッセージがピア A のポート 5555 に配信されることに混乱していますか? ピア A は、受信したメッセージごとに個別のスレッドを作成しますか?

UDP を使用すると、おそらくこの問題は解決されます。各ピアと通信するために個別のスレッドを作成する必要はなく、誰もが同じウェルノウン ポートにメッセージを送信できます。しかし、メッセージが配信されることを保証するために TCP を使用したいと考えています。この問題を処理し、1 つのピアとの通信に 1 つのスレッドのみを使用するための良い方法は何ですか?

4

2 に答える 2

2

TCPは「接続された」プロトコルであるため、説明した問題は発生しません。これは、基本的に、2つのピアが他の何かが発生する前に通信をネゴシエートする必要があることを意味します。その後、TCP はデータ パケットの順序を制御して、宛先に正しい順序で到着するようにします。ところで、TCP は Transmission Control Protocol の略であるため、説明したことが起こらないようにすることに重点が置かれています。UDPの場合はまったく当てはまりません。

クライアントからの接続をServerSocket受け入れるSocketと、ネゴシエーションが終了し、TCP ストリームがその通信専用になります。

新しい接続が作成される唯一の方法は、クライアントが新しい Socket を介して別の接続を発行する場合です。

しかし、自分自身を納得させる最善の方法は、アプリにログを追加して、自分で試してみることです。

于 2012-07-27T16:22:55.700 に答える
2

リスニング、またはサーバー、ソケットと接続されたソケットを混同しています。

リッスン側で TCP 接続が受け入れられると、2 つの当事者間でまったく新しい全二重ソケットが作成され、データを交換できるようになります。リスニング ソケットの唯一の目的は、接続を受け入れることであり、アプリケーション データは接続を通過しません。

その新しく接続されたソケットをスレッドに渡すことができますが、確かにそうする必要はありません.1つのスレッドで多くの非ブロックソケットを処理できます.Java NIOパッケージはまさにこれのために作成されたと思います.

于 2012-07-27T16:23:30.440 に答える