2011-01-26 15 views
7

AppEngineにソーシャルネットワーク/デートタイプのアプリケーションを作成しましたが、現在チャンネルの上にチャットを追加中ですAPI。しかし、私が持っている問題は、チャットが進行中(Facebookでできるように)に、ユーザーが新しいページをリロードしたり、移動したりする可能性があるということです。つまり、サーバーは、特定のクライアントの新しいチャネルIDトークンを生成する必要があるかどうか、または特定のクライアントにチャネルトークンが既に割り当てられているかどうかを簡単に認識できません。AppEngine Channel API - チャンネルがまだ開いているかどうかを確認する最善の方法(サーバー側)

特定のクライアントにすでにチャネルが開いているかどうかを確認する方法がある場合(サーバー側)は非常に便利です。たとえば、クライアント "Jack"に "Jack-Jan-21-2010"というチャンネルIDを割り当てた場合、IDが関連付けられているチャンネルが既に開いている場合は、サーバー側でチェックすることができます。 Jack-Jan-21-2010」に記載されている。これはonerror()とonclose()コールバックを監視することでクライアントサイドで(ソート)追跡することができますが、指定されたIDに関連付けられたチャネルがすでに開いています。

AppEngine Channel APIを使用している間に、チャンネルが既に開かれているかどうかを知る(サーバー側の)インテリジェントな方法は誰にも分かりますか?

答えて

18

パート1:解決あなたが本当にクライアント接続を追跡する必要がありますが、あなたの問題を解決するためにあなたが求めているものならば、私はあなたの質問からわからない場合は、以下の問題

パート2参照。

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

これが正しい場合、私は2つの代替ソリューションを用意しています.1つは簡単ですが、ユーザーエクスペリエンスが優れていないものが1つ手の込んだものですが、より滑らかな結果が得られます。

  • トークンをクッキーに保存します。ページを再レンダリングするときは、再度channel.create_channelを呼び出すのではなく、クッキーのトークンを使用してください。トークンが期限切れになると、ユーザーが元のページに滞在した場合と同じようにエラー・コールバックが発生します。この時点で、再度channel.create_channelを呼び出します。この問題は、Comet接続の性質上、再接続が遅くなることがあります(悪いケースでは最大10秒以上)。

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

はパート2:あなたの機能要求

ことが判明した場合、私は誤解だとあなたが本当にクライアント接続を追跡する必要があります:

かどうかを確認するために、組み込みの方法はありませんクライアントは、現在クライアントIDによって識別されるチャネルに接続されます。

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

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

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

それまでの間、クライアントからのハートビートHTTPリクエストを使用して、「ちょっと、私はまだここにいます」というメッセージを1分ごとに送信することができます。 2分ごとに実行される何らかの種類のタスクが必要で、チェックインしていないクライアントを非アクティブにする必要があります。このデータをどこかに保存する必要があります。

+0

うわー、素晴らしい答え。私は数時間後にそれを消化しようとしています。ありがとうございました。 -Alex –

+0

問題を正しく返信しました。あなたが提案したソリューションは、妥当な回避策のようです。私はiframeソリューションが面白そうだと思うし、おそらく私の問題を解決するでしょう。 –

+0

Moishe、次のリリースで "存在"が得られたら、おいしい七面鳥を買うよ。 kthnx :) –

関連する問題