1

私が持っている考えは、クライアントがサーバー上のチャットルームに接続して相互に通信できるということです。チャットルームでは、別のユーザーをターゲットにすることもでき、それらのユーザーが互いに話すことができる必要があります。

今問題に。これを実装するための最も簡単で最良の方法がどちらであるかわかりません。ユーザーが何かを書いたときに私が考えたチャットルームの場合、メッセージはサーバーに送信され、サーバーはそのメッセージを他のクライアントにエコーします。私が持っている他のオプションがわからない。

私が最も混乱しているのは、2人のクライアントだけが互いに会話できるようにする方法です。サーバーがプロキシとして機能し、メッセージを他のクライアントに転送するだけですが、これは非効率的です。これに代わる唯一の方法は、2つのクライアントが相互に接続を確立することです。これを達成するために最も一般的な実装はどれですか?

私はC++でunixソケットを使用しています。

4

2 に答える 2

1

マルチスレッドのクライアント/サーバーを実装できます。メッセージを中継する単一の「サーバー」が正しい方法です(メッセージのグローバルな順序を維持するため)。また、たとえば「サーバー」がダウンした場合に備えて、リーダー選出アルゴリズム(http://en.wikipedia.org/wiki/Bully_algorithm)についても検討してください。チェックアウト

これを行う別の方法は、シグナルとイベント駆動型プログラミングを使用することです。

于 2012-11-27T22:09:18.100 に答える
1

多対多チャットと1対1チャットにはいくつかのオプションがあります。ただし、多対多チャットの合理的に適切なオプションは、前述のとおりにすることだけです。中央サーバーにメッセージを送信すると、サーバーはメッセージを他のすべての接続されたクライアント(または同じ「部屋」)に中継します。 /「チャネル」)。

1対1のチャットの場合は、まったく同じモデルに従うことをお勧めします。これは、サーバーからプロキシとして、接続されている他の1つのクライアントにのみメッセージが送信される多多チャットリレーの特殊なケースです。 。これは単純で、すべてのクライアントのIPアドレスを他のすべてから隠します。

ただし、1対1の通信がチャットよりも大量になる場合(ファイル転送など)、直接の1対1の通信が適切な場合があります。この場合、サーバーは直接のピアツーピア通信チャネルの開始をリモートユーザーに中継し、おそらくセットアップ時にIPアドレスを交換する必要があります。その後、クライアントは特別な目的の直接通信のために相互に直接接続します。 (通常、オプションではありますが、サーバーへの接続を維持します)。

したがって、1対1の通信は通常、多対多の一般的な場合のようにサーバーによってプロキシされ、その方法が非効率的である程度は表面的なものです。特別な目的の1対1の通信(ファイル転送、VoIPなど)は、通常、最初にサーバーによって調整された直接のクライアント間接続を使用して行われます(つまり、直接通信の各側を準備します)。

実装のヒント:サーバーはすべてTCPです。ノンブロッキングソケット、POSIXシステムコールについて読んで、pollTCPを介したメッセージフレーミングのアイデアを頭の中で転がしてみましょう。その後、サーバーコードのマルチスレッド[およびスケーラビリティ]の問題をスキップできます。クライアントは、サーバーと同じカスタムTCPプロトコルを話す以外に、あなた次第です。

于 2012-11-28T07:42:26.453 に答える