7

私は AppEngine でソーシャル ネットワーク/デート タイプのアプリケーションを構築しており、現在 Channel API の上に構築されたチャットを追加中です。ただし、私が抱えている問題は、チャットの進行中にユーザーがリロードしたり、新しいページに移動したりする可能性があることです (Facebook のように)。これは、特定のクライアントに対して新しいチャネル ID トークンを生成する必要があるかどうか、または特定のクライアントに既にチャネル トークンが割り当てられているかどうかを、サーバーが簡単に判断できないことを意味します。

特定のクライアントがすでにチャネルを開いているかどうかを (サーバー側で) チェックする方法があれば、非常に便利です。たとえば、クライアント「Jack」に「Jack-Jan-21-2010」というチャネル ID を割り当てた場合、その ID に関連付けられたチャネルがすでに開いているかどうかをサーバー側で確認できるようにしたいと考えています」ジャック-2010 年 1 月 21 日」. これは、onerror() および onclose() コールバックを監視することによってクライアント側で (一種の) 追跡できますが、特定の ID に関連付けられたチャネルがすでに開いています。

AppEngine Channel API を使用しているときに、チャネルが既に開いているかどうかを (サーバー側で) チェックするインテリジェントな方法を知っている人はいますか?

4

1 に答える 1

18

パート1:問題の解決

クライアント接続を本当に追跡する必要がある場合は、以下のパート2を参照してください。ただし、質問から、求めているものが問題を解決するかどうかはわかりません。

あなたの問題をエコーバックできるかどうか見てみましょう。あなたはチャットアプリを書いていますが、それは完全にAJAXではないサイト用です(たとえば、Gmailのように)。このサイトには、ユーザーが別のページへのリンクをクリックした後にチャネルを再設定する必要があるページナビゲーションが含まれています。ユーザーがナビゲートすると、新しいページがレンダリングされ、その時点で新しいトークンを取得しないようにします。同じclient-idで既存のトークンとチャネルを再利用したい。

それが正しければ、2つの代替ソリューションがあります。1つは簡単ですがユーザーエクスペリエンスはそれほど優れていません。もう1つはトリッキーですが、最終結果ははるかにスムーズです。

  • トークンをCookieに保存します。ページを再レンダリングするときは、channel.create_channelを再度呼び出すのではなく、Cookieのトークンを使用するだけです。トークンの有効期限が切れると、ユーザーが元のページにとどまっていた場合と同じように、onerrorコールバックが返されます。この時点で、channel.create_channelを再度呼び出します。これに伴う問題は、Comet接続の性質上、再接続が遅くなる可能性があることです(悪い場合は最大10秒以上)。

  • チャットに関連しないサイト全体をiframeでラップします。チャンネル作成コードとUIを外部iframeに配置します。これにより、ユーザーがナビゲートするたびに再接続する必要がなくなります。これにより、ナビゲーションのダウンタイムが回避されます。少量のFirebugの調査で明らかになるように、orkutはフローティングdivでこの手法を使用していることに注意してください。

パート2:機能リクエスト

私が誤解していることが判明した場合、クライアントの接続を追跡する必要があります。

現在、クライアントがclient-idで識別されるチャネルに接続されているかどうかを確認する組み込みの方法はありません。

ただし、現在、「プレゼンス」(チャットの意味で)を追加して、クライアントが特定のクライアントIDで作成されたチャネルに接続または切断したときに、アプリが登録して投稿を取得できるようにしています。また、プレゼンスを「プローブ」して、特定のクライアントIDが接続されているかどうかを照会できる場合もあります(この部分の詳細については引き続き作業します)。

これはトークンベースではなく、クライアントIDベースであることに注意してください。

これについてはまだ明確なリリース日はありませんが、私が言ったように、現在積極的に取り組んでいます。

それまでの間、クライアントからアプリに戻るハートビートHTTPリクエストを使用して、毎分「ねえ、私はまだここにいます」と言うことができます。たとえば、2分ごとに実行され、チェックインしていないクライアントを非アクティブとしてマークする何らかのタスクが必要です。また、このデータをどこかに保存する必要があります。

于 2011-01-26T16:39:43.373 に答える