2012-11-02 47 views
1

我正在編寫一個功能之間有一個聊天模塊的Android應用程序。我選擇使用長輪詢來實現聊天。使用長輪詢實現Android聊天模塊

因爲我試圖避免吃掉用戶手機電池,我想添加到實施GCM消息平臺來通知設備有關新消息。

這個想法是當用戶在他的屏幕上打開應用程序時使用長輪詢,因此參與實時聊天會很快,並且不會發送很多GCM消息,而在閒置時服務器會知道用戶目前不在輪詢,並且會在新消息到達時向設備發送GCM消息以將其喚醒。

我有幾個問題,實施這個方法掙扎:

  1. 什麼是知道用戶的狀態的最好方法 - 是HES投票現在或等待推送消息將其喚醒。我是否應該設置應用程序以在服務器進入睡眠狀態時通知服務器,或者服務器應該自行檢測它?

  2. 如果我設置它,以便應用程序將通知服務器何時切換模式,如何在此通知未通過的情況下恢復。 (當客戶端正在等待gcm並且服務器認爲它正在輪詢並且不會發送一個..)

  3. 我遇到了一些情況,即客戶端正在輪詢並且服務器即使收到新消息也沒有響應。也許某種服務器上的客戶端不知道的超時...如果這是一個錯誤,我會修復它,但是當客戶端認爲它正在輪詢而服務器不知道它時,我該怎麼辦?請求的超時時間太長,無法等待下一次輪詢)。

我的客戶端是原生Android,Web服務是WCF(C#)。

任何想法都會有幫助。

+0

你的問題編寫得很好,但有一些問題可能使得很難在SO上得到答案。你在一個問中提出三個不同的問題。此外,它是非常開放的,而不是更實際的「可回答」問題,通常是首選的(問「我應該......」不是很負責任,所有答案都必須以「依賴」開始)。這也使你的問題相當「本地化」(即非常特定於你的情況)。 – Jeroen

+0

也許你可以將它分爲三個問題,並且儘可能使它們不那麼開放式,可回答並且儘可能沒有本地化。 – Jeroen

+0

想到將它分成多於1個問題,但所有部分都提到了同樣的問題 - 移動應用的即時消息協議實現。因爲每個問題都取決於所有其他答案,所以我選擇把它全部寫成一個大問題。 – Idan

回答

2

我還沒有使用GCM,但我有很多移動消息應用程序的經驗,所以會試圖解釋我們所遵循的。

什麼是知道用戶

第一關的狀態,最好的辦法 - 長輪詢當應用程序在前面不接收即時消息的最佳途徑。您需要保持打開tcp連接才能立即收到它! (希望您的通知也應該包含該消息)任何類型的輪詢都將確保您浪費電池並且不會收到消息即時消息即時消息。第二 - 我會認爲客戶端應該通知服務器其狀態(前景/背景),以便服務器知道如何響應。 所以我的建議是使用TCP套接字CIR和使用輪詢作爲備份時的背景(如果服務器失去了「客戶端去背景信息」)

  1. 要恢復使用長輪詢(10分鐘)從服務器獲取更新並通知服務器您的狀態。

  2. 如果您使用我提到的方法(使用tcp套接字),服務器應該知道您的應用程序在前臺運行,只要連接處於活動狀態。另外一個服務器應該總是用增量更新來回應投票(你的投票應該在上次服務器發送的時候發送)

希望這會有所幫助。

+0

應用程序在前面的長輪詢是因爲我想使用HTTP進行輪詢。保持TCP連接從移動應用程序打開到遠程服務器並不那麼簡單,這就是爲什麼我要採用jabber協議(gtalk,whatsup,facebook)的方式工作。 – Idan

+0

服務器始終保留髮送給客戶端的最後一條消息標識,以便它只能發送增量更新。在每次會話的第一次登錄時,客戶端可以修改此計數器以恢復可能丟失的消息。 – Idan