10

サイトがあり、strophe.js ライブラリと ejabberd XMPP サーバーを使用してチャット システムを開発しました。PHP で開始されたセッション アタッチメントを使用します (社内ライブラリを使用)。PHP スクリプトから RID と SID を取得し、strophe のセッション アタッチメントを使用します。上記の RID と SID は Cookie に保存され、Cookie の RID 値は strophe.js の RID が更新されるたびに更新されます。(これは、ページの更新/サイトの他の場所へのナビゲーションでセッション ID を再利用できるようにするためです)

現在、複数のタブ/ウィンドウで動作させる予定です。私は Facebook の実装を観察しましたが、タブごとに特定のドメインへの長いポーリング リクエストがあります。このドメインはタブごとに異なります。たとえば、タブ 1 は 0.86.channel.facebook.com になります。2 番目のタブは 1.86.channel.facebook.com です。私が理解しているように、これは特定のドメインへの 2 つのアクティブなリクエストというブラウザの制限を解決することです。この複数ドメイン ソリューションはどのように実装されていますか?

次は、チャット セッション自体についてです。チャット セッションはタブごとに異なりますよね? UI は Facebook のように各タブとどのように同期されますか? 私の考えは、すべてのアクションごとに、チャットに関連して行われたアクションを含むメッセージがユーザー自身の JID に送信されるということです。たとえば、チャット ウィンドウを開くと、次のようなメッセージ スタンザが送信されます。

<message from="my_own_jid" to="my_own_jid" type="chat">
    <body>{"jid-of-contact":"open-chat-box"}</body>
</message>

これはチャット クライアントでキャッチされ、それに応じて UI が調整されます (この場合、連絡先のチャット ボックスが開きます)。

この実装に関する提案やコメントはありますか?

ありがとう!

4

2 に答える 2

8

私と私のチームはまったく同じ問題に取り組んでいました - Ejabberd の代わりに Openfire を使用していることだけです (ほとんどの原因は、Java のスキルはありますが、Erlang に慣れていないためです)。当社はブラウザゲームを構築しています。

当社のソリューションは以下で構成されています。

  • XMPPHP - 事前バインド用
  • Strophe.js - セッションアタッチ用 (変更)
  • Punjab - 接続マネージャーとして (拡張、変更)
  • Openfire - XMPP サーバーとして

Openfire の BOSH 実装は、最初は他のコンポーネントとうまく連携していないように見えたため、パンジャブ語を使用しています。

基本的に、タブごとにセッションを作成しないことにしました。これは、一部のゲームが通常の Web サイトと同じように動作するためです。リンクをクリックすると、完全に新しいページが要求されます (新しいゲームは ajax で完全に動作し、ほとんどの GUI は同じままです)。つまり、Web ベースのチャットは、ユーザーが「Web サイト上を移動する」環境で動作する必要があります。1 つのタブの 1 つのセッションは、ページ リクエストごとに新しいセッションを意味します。これは、プレーヤーがかなりすばやくクリックすることが多いため、大きなオーバーヘッドのように思えます。そのため、1 つのセッションを作成して、1 人のプレーヤーに固定する必要がありました。

これを解決するために、皆さんと同じように strophe.js を変更して RID を読み取り、Cookie に保存するようにしました。これにより、すべてのタブが現在の RID を認識し、正しい値にインクリメントされます。もう 1 つのことは、Strophe に CID を XMPP スタンザの本文に追加させたことです。クライアント ID のような CID。すぐに使い方を説明します..

次の計画は、パンジャブ語で 2 つのことを変更することでした。最初に、待機中のリクエストがパンジャブ語で保存される通常の方法を置き換えるクラスを追加しました。待機中の BOSH リクエストは、CID (strophe.js がすべてのリクエストの本文に追加されるようになりました) をキーとしてディクショナリに保存されるようになりました。同じタブから別のリクエストが到着すると、パンジャブ語は空の応答を送信する待機中のリクエストを認識します。配信される新しいスタンザがある場合、パンジャブはこれらをディクショナリ内のすべての待機中のリクエストに送信します。したがって、着信メッセージはすべてのタブに配信されます。次に、あるタブから送信されたメッセージがすぐに他のすべてのタブに「戻って」配信されるように、いくつかの行を追加しました。そのため、メッセージは他のタブの履歴にも表示されます。

もちろん、プレイヤーが次の画面に移動したときに GUI のチャット履歴が失われないようにするなど、直面しなければならない問題は他にもあります。これを Cookie に保存するのは良くありません。リクエストごとにすべての情報が送信され、大量のトラフィックが発生するからです。このために、XEP-0136 メッセージ アーカイブに似たものを実装することを考えています。

一言で言えば、strophe.js と punjab のパッチ適用/拡張に対処する必要があり、標準を少し変更しています。しかし、今のところ問題なく動作しており、このセットアップがベータ版でどのように機能するかを楽しみにしています.

于 2010-11-17T10:48:50.187 に答える
3

私の解決策:

各タブには、異なるリソースに独自の接続があり、すべて優先度 1 です。

openfire でサーバー変数を追加するroute.all-resources: true
と、メッセージはすべてのリソースにブロードキャストされます。

于 2011-12-19T02:07:30.720 に答える