Techioz Blog

サーバー アプリケーション内で複数のクライアント セッションを管理するにはどうすればよいですか?

概要

GTalkに似たWebチャットアプリケーションを作成しています。クライアント側は Orbited + Sinatra 、サーバー側は Ruby に基づいています。すでにすべてのプロトコルを実装しており、すべてうまく機能しています。

しかし、1人のユーザーから複数の接続があった場合にどう対処すればよいかわかりません。たとえば、2 つの異なるブラウザからチャットにログインしたとします。 Google は非常に丁寧に対応しており、2 つのチャットはまったく同じであるように見えます。しかし、私のアプリでは連絡先リストにまったく同じユーザーが 2 人表示されているだけで、これは間違っています。

次に、サーバー クライアント プールの小さな例を示します。

Server
--> Connections
      |
      - Client (User Information, ConnectionID)
      - Client (User Information, ConnectionID)
      ....
      - Client (...)

メッセージには 2 種類あります: プライベート (ユーザー間)、パブリック (ユーザー対会議)。

このような状況にどう対処するかを考えていますか?助言がありますか?

解決策

曖昧な答えで申し訳ありませんが、次のようになります。特定の接続/セッションからの「プル」に応答するだけでなく、特定のユーザー ID のすべての接続にチャット テキストを「プッシュ」する必要があります。

クライアントがどのように動作するかはわかりませんが、更新をポーリングする場合は、最近のメッセージのユーザー アカウントごとの画像をデータベースに保存し、そのユーザーに関連するすべての更新を DB から取得する必要があるでしょう。チャットを「ポイントツーポイント」セッションに関連付けます。

うーん。これについてもっと詳しく説明する時間がありません…

1 対 1 か大規模グループかに関係なく、関与するセッション (したがってユーザー) を識別する各会話に対して、ある種の「セット」データ構造を作成します。各会話の投稿のリストを時系列順に作成します。これをスキャンして各クライアントの表示を更新し、まだ閲覧されていない投稿を提供します。

質問自体についてのコメントの余談として、誰かが「それは完了した」と指摘しましたが、コードをダウンロードしてください。おそらくそれは有効な指摘ですが、おそらくそうではありません。受け入れて拡張できる形式の既存のコード ベースを見つけることができれば、それは素晴らしいことです。そうでない場合 (宿題であるため、または会社の方針で「今すぐここで最初から実行する」と定められているため)、つまり、「ソリューション」をダウンロードすることは有効な批判ではありませんね。