Java 言語で純粋なソケットを使用して、クライアント/サーバーのインスタント メッセンジャーを実装する必要があります。
サーバーは多数のクライアントにサービスを提供する必要があり、使用するソケット (TCP または UDP) を決定する必要があります。
ありがとう、コスタ。
4 に答える
TCP
理由:
TCP: 「転送されたデータがそのまま残り、送信されたのと同じ順序で到着するという絶対的な保証があります。」
UDP: 「送信したメッセージやパケットが届く保証はまったくありません。」
詳細については、http ://www.diffen.com/difference/TCP_vs_UDP をご覧ください。
チャット メッセージが失われる可能性がありますか?
編集:「大規模なチャット プログラム」に関する部分を見逃していました。チャット プログラムの性質上、TCP サーバーである必要があると思いますが、ユーザーが UDP プロトコルを介して送信する実際のテキスト コンテンツを想像することはできません。
TCP サーバーの最大制限は、同時に 65536 接続です。本当にその数を超える必要がある場合は、現在のサーバーの負荷に応じて適切なサーバーに着信接続を送信するディスパッチャー サーバーを作成できます。
両方を使用できます。実際のメッセージの交換には TCP を使用します (そのため、データが失われることはなく、大きなメッセージ (jpeg などを含む) のストリーミングが可能です)。UDP は、メッセージがキューに入れられているクライアントに短い「connectNow」メッセージを送信する場合にのみ使用してください。 (NotLoggedIn、TCPconnected、TCPdisconnected、LoggedOut) のような状態を持つことができ、通常のメッセージ交換イベントと同様に状態遷移を制御するためのさまざまなタイムアウトが設定されます.UDP 'connectNow' メッセージは、'TCPdisconnected' のクライアントに接続するように指示し、次の場所に移動します。 'TCPconnected' は、非アクティブ タイマーがクライアントに今のところ切断するように指示するまで、メッセージを交換しながら留まる場所です。クライアントが接続するまで、X 秒ごとに N 回メッセージを送信します。クライアントは、万が一の場合に備えて、X 分ごとにポーリングを試行する必要があります...
メッセージがサーバーに配信されたかどうかをユーザーが知る必要があるかどうかによって異なります。UDP パケットには固有の確認応答がありません。クライアントが IM メッセージをサーバーに送信し、それが転送中に失われた場合、クライアントもサーバーもそれを認識できません。
(簡単な答えは「TCP を使用する」ですが、設計上の意味を自分で考える価値があります。)
TCP を使用すると信頼性が得られます。これは、インスタント メッセージング中には確かに望ましいことです。会話中にメッセージがドロップされることは望ましくありません。
ただし、グループ メッセージングを使用する場合は、マルチキャストを使用することになる可能性があります。このような場合、UDP はポイント ツー マルチポイントを処理できるため、UDP が適切な選択肢になります。マルチキャスト アプリケーションに TCP を使用するのは難しいでしょう。なぜなら、送信者は複数の受信者の再送信/送信レートを追跡する必要があるからです。1 つの代替方法として、ポイント ツー ポイント チャットに TCP を使用し、グループ メッセージングに UDP を使用することが考えられます。