1

GTalk に似た Web チャット アプリケーションを作成しています。クライアント側は Orbited + Sinatra、サーバー側は Ruby をベースにしています。私はすでにすべてのプロトコルを実装しており、すべてうまく機能しています。しかし。問題が発生しました - 1 人のユーザーから複数の接続がある場合の対処方法がわかりません。たとえば、2 つの異なるブラウザーからチャットにログインしたとします。Google はそれをうまく処理しており、2 つのチャットはまったく同じように見えます。しかし、私のアプリでは、連絡先リストにまったく同じユーザーが 2 人だけ表示されますが、これは正しくありません。

以下は、サーバー クライアント プールの小さな例です。

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

プライベート(ユーザーからユーザーへ)、パブリック(ユーザーから会議へ)の 2 種類のメッセージがあります。

そのような状況に対処する方法を見つけようとしていますか?助言がありますか?

4

2 に答える 2

0

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

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

ぐら。今はこれを詳しく説明する時間がありません...

        • アップデート: - - - - -

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

質問自体に関するコメントの余談として、誰かが「それは完了した」と指摘し、コードをダウンロードしてください。おそらくそれは有効な点ですが、そうではないかもしれません。既存のコード ベースを受け入れて拡張できる形式で見つけることができれば、すばらしいことです。そうでない場合 (それは宿題だから、または企業ポリシーが「今すぐここでゼロから行う」と述べているため)、「ソリューション」をダウンロードすることは正当な批判ではありませんか?

于 2009-11-13T01:26:39.287 に答える
0

クライアントが接続するとき、一意の識別子を与える必要があります。従来の ASP にはそれSessionIDがありましたが、一意の何かが必要なだけで、そのキーを Cookie を介してクライアントに送り返すことができます。

その後、クライアントから送信されたメッセージは共通の領域に配置する必要があります。従来の ASPApplicationでは、このタスクに適したオブジェクトがありました。

これから、チャットルームの実装、メッセージのフィルタリング、何かのささやきなど、どこにでも行くことができます.

私は約 7、8 年前に、メッセージを XML ファイルに保存するようなことをしました。ただし、データベースを使用してそれを行うこともできます。

疑似コードとして、すべての Web リクエストに対して次のようになります。

    リクエストに Cookie ID がない場合
       一意の ID を作成し、Cookie を設定する

    着信アクションを処理する
       ケース「プライベート」:
            その一意の ID にメッセージを書き込みます
       ケース「公開」
            対象ユーザーなしでメッセージを書く
       場合 ...

    ユーザー インターフェイスを表示する
        一意の ID の、またはターゲットのないすべてのメッセージを一覧表示します
        一意のIDを値として使用して、ユーザーリストを作成します(あなたのものを除く)

    n 秒ごとに更新

于 2009-11-13T01:27:22.797 に答える