2011-10-12 35 views
4

在我的手機上使用我的GAE應用程序。即使我通過socket.close()函數手動關閉套接字,我在通道api中獲取/ _ah/channel/disconnect斷開連接通知時遇到問題。該職位是在延遲一分鐘後發生的。有誰知道如何加快速度?在我的情況下,socket.close()不會產生通道斷開通知(只有在手機中,儘管..它完美地從筆記本電腦)!谷歌應用程序引擎中的頻道API中的頻道斷開通知

回答

4

Channel API前端服務器「意識到」通道斷開所需的時間取決於瀏覽器的實現。

在性能良好的瀏覽器上,我們捕獲beforeunload事件,並向我們的前端發送一條消息,指出「此客戶端正在離開。」在其他瀏覽器上,我們可能無法獲得該事件(或者由於各種實施原因(例如瀏覽器發送頻率太高(FFFUUUU IE)),我們可能無法收聽),或者一旦我們收到事件,我們發送的XHR可能會得到吞噬。在這種情況下,前端服務器意識到客戶端已經消失,因爲它沒有收到心跳 - 這是您手機上發生的情況。 (出於好奇,是什麼電話?)

你的情況很有趣,因爲你明確地調用onclose。這樣做的唯一方法就是處理具有頻道FE代碼的iframe - 換句話說,onclose就好像整個瀏覽器窗口關閉一樣;它沒有利用瀏覽器仍然處於良好狀態並可能等待關閉直到發送消息的事實。因此,我建議兩件事:爲您的代碼添加自定義處理程序(與您的/ _ah/disconnect處理程序執行相同的操作),以便在知道手動關閉通道時可以創建XHR。這很爛但功能強大。這對你來說是無趣的,你需要在你的javascript代碼中明確地知道你的客戶端ID。

其次,向我們的問題跟蹤器(http://code.google.com/p/googleappengine/issues/list)添加問題,以便在明確調用onclose時請求更好的斷開連接通知。

希望有幫助;抱歉,現在沒有簡單的答案。

+0

是的,我明白你的觀點。但即使我添加了自定義處理程序並在那裏執行邏輯,如果瀏覽器發生beforeunload事件並且通道斷開連接,該怎麼辦!你是否告訴我也要聽beforeunload事件?這是否會在手機中沒有任何網格工作? – Hari

+0

我剛纔發現,在iPad,iPhone等上運行的safari不支持onbeforeunload。我認爲這是我面臨的問題。所以我可以添加一個自定義處理程序,就像您在之前的文章中提到的那樣,但是當用戶關閉瀏覽器或導航到其他頁面時,我將無法聽到該事件的正確性?有沒有其他辦法可以擺脫這種困境? 非常感謝 – Hari

+0

您描述問題的方式聽起來像您手動調用關閉的頻道 - 我的想法是,如果您這樣做,那麼您還可以通過XHR向您的應用程序發送消息來說「我正在關閉這個頻道。」 但是,如果瀏覽器關閉並且永遠不會調用oneforeload,但是,您確實沒有簡單的方法來了解它。這就是爲什麼我們在我們的前端使用心跳 - 當我們沒有得到心跳一分鐘時,我們關閉頻道並通知您的應用程序。 –

相關問題