2013-02-22 42 views
2

我有一個使用通道API的應用程序。連接應該始終處於活動狀態(24x7),並且我已經以這樣一種方式實現了連接,即每次通道斷開連接時,都會自動創建一個新通道。這在大多數情況下都能正常工作,但我有一些情況,其中onError()方法不會被調用(例如,連接的WIFI更改,或者計算機將進入休眠狀態並返回)。而我的JS應用程序錯誤地假設,如果頻道不是這樣,頻道仍然存在。GAE Channel API - 檢查套接字是否存在於Javascript中

我想到的一個解決方案是ping服務器,要求發送消息。就像Keep Alive一樣。但這對於服務器來說是一個很大的負擔。 (例如,每10秒發送ping請求的1000個客戶端就像每秒100個請求一樣)

所以我想知道是否有辦法檢查連接是否在本地活動,這樣我就不會無意中在服務器上執行DoS連接。

感謝

回答

3

您可以創建一個GAE cron作業,告訴您的服務器發送保持活動消息,而不是讓客戶端請求它。這樣,無論您擁有多少個客戶端,每10秒鐘只有一個請求。

儘管您需要將活動客戶端列表存儲在memacache/datastore中。

+0

但是,通過從服務器發送請求,您如何確定連接是否存活? Channel API不提供任何反饋,無論消息是否成功傳遞。我可能會發送到一個死信道,但錯誤地認爲它仍然存在。我可以讓客戶回覆。但是,我們再次回到同一問題 – budsiya 2013-02-22 19:04:00

+0

期待頻道活着。因此,客戶應該定期進行ping。如果您沒有收到任何超時期限的頻道消息,請在JS中放置一個定時事件。如果頻道死了,客戶端應該請求一個新頻道。 – dragonx 2013-02-22 23:00:29

+0

使sesnse。感謝您的建議。 :) – budsiya 2013-02-23 14:30:54

0

我怕沒有選擇,但要求服務器發送消息並檢查它是否回來在合理的時間框架。

你的JS應用程序可以週期性地查驗一些小()靜態文件(可能連外GAE),以檢查是否連接已斷開或電腦去睡覺。這可以更便宜,但不會給你100%的保證。

+0

ping靜態文件將讓JS知道它可以訪問互聯網,但它不會指示通道是否仍然存在。 – dragonx 2013-02-22 07:30:34

相關問題