4

電話で GAE アプリケーションを使用しています。socket.close() 関数でソケットを手動で閉じても、チャネル API で /_ah/channel/disconnected への切断通知を取得する際に問題に直面します。投稿は、たとえば 1 分の遅延の後に行われます。速度を上げる方法を知っている人はいますか?私の場合、socket.close() はチャネル切断通知を生成しません (ただし、電話でのみ..ラップトップから完全に動作します)!

4

1 に答える 1

4

Channel API フロントエンド サーバーがチャネルが切断されたことを "認識する" のにかかる時間は、ブラウザーの実装によって異なります。

正常に動作するブラウザーでは、beforeunload イベントをキャッチし、「このクライアントは終了します」というメッセージをフロントエンドにポストします。他のブラウザーでは、イベントを取得できない場合があります (または、ブラウザーが頻繁に送信する (FFFUUUU IE) など、さまざまな実装上の理由でイベントをリッスンできない場合があります)。または、イベントを取得すると、送信する XHR が取得される場合があります。飲み込んだ。このような場合、フロントエンド サーバーは、ハートビートの受信に失敗したため、クライアントがなくなったことに気付きます。これが電話で起こっていることです。(好奇心から、何の電話?)

明示的に onclose を呼び出しているため、あなたのケースは興味深いものです。これが行う唯一のことは、Channel FE コードを含む iframe を破棄することです。つまり、onclose は、ブラウザー ウィンドウ全体が閉じられたかのように動作します。ブラウザがまだ良好な状態にあり、メッセージが送信されるまで閉じるのを待つことができるという事実を利用していません。

したがって、次の 2 つのことをお勧めします。コードにカスタム ハンドラーを追加し (/_ah/disconnect ハンドラーと同じことを行います)、チャネルを手動で閉じていることがわかっているときに XHR を作成できるようにします。これは不格好ですが機能的です。残念なことに、JavaScript コードでクライアント ID を明示的に知る必要があります。

次に、問題トラッカー (http://code.google.com/p/googleappengine/issues/list) に問題を追加して、onclose が明示的に呼び出されたときに、より適切な切断通知を要求します。

お役に立てば幸いです。申し訳ありませんが、今は簡単な答えではありません。

于 2011-10-12T14:30:13.327 に答える