2012-03-15 68 views
2

我正在構建一個多操作系統鏡像系統,我想使用混合客戶端服務器和p2p通信方法來實現(至少這是我描述它的最好方式)。(Android,iOS,Windows,Linux)服務器輪詢VS推送與執行服務器

我的問題是,在某些時候,我有一箇中央服務器(AppEngine上,所以有什麼我可以因爲時間和網絡能力的限制做的限制),這將需要得到一個消息,不同設備的主機,其不一定運行相同的操作系統(Windows,Android,iOS,Linux等)。

Android和iOS(或任何其他移動平臺)是它看起來像我將在兩個級別上的主要問題。

1 - 它們都受到電池電量的限制(比筆記本電腦更好,臺式機根本就沒有這個問題),所以無論採用哪種方法,都需要考慮到這一點。 (更難,因爲用戶對其防火牆的控制比在他們正在運行的網絡上的控制要少)。我的中央服務器將維護哪個設備具有哪個IP地址的表格,但是根據我的理解,如果存在NAT或防火牆,那麼如果端口未被轉發,它將無法到達它。

因爲我將爲每個操作系統編寫特定的客戶端,所以我更喜歡使用更通用的解決方案。我一直傾向於編寫一個非常簡單的HTTP服務器,它位於每個客戶端並接受請求(appengine能夠發送)並將它們視爲警報客戶端執行操作(與服務器或其他客戶端)的消息。但是,我遇到了NAT /防火牆的問題。例如,如果appengine需要發送消息給AndroidDevice1,它會從表中獲取IP地址並向它發出請求。但是,如果端口未正確轉發,則這不起作用,並且如果用戶位於3g/4g上,則防火牆由數據提供商控制。

因此,我開始考慮使用Android C2DM,但我想要一個可以跨平臺實現的解決方案。

我能想到的唯一的其他方法就是讓客戶端輪詢服務器的消息。儘管如此,這還是有電池和網絡消耗問題。

是否有其他方法可以實現這一點?如果不是,上述哪一種方法在平衡可用性,功耗和數據消耗以及用戶輸入方面是最好的(用戶需要做的越少,客戶端設置(即端口轉發等)越好)?請注意,我不打算讓這成爲討論/火焰戰爭,而是對事實的合理表述。

在此先感謝!

回答

2

您可以創建從設備到服務器的持久TCP連接,然後通過此打開的連接進行通信。這與keepalive數據包大部分是非常簡單的連接。

從理論上講,這將通過無線電消耗一些電池,但實際上我已經體驗到電池沒有太大影響。關鍵是保持這條線路上的通信到最低限度。

如果AppEngine上不允許這種方式,你可以運行自己的套接字服務器,然後該服務器,並使用REST的AppEngine上的服務器之間的通信。我使用的套接字服務器是Apache MINA,並且在可伸縮性方面沒有問題。

你將不得不使用這種方法或任何其他方法的另一個問題是,在iOS(據我所知)你不能讓一個TCP套接字時打開應用進入後臺。與iOS設備進行通信的唯一的事情是蘋果推送通知服務

+0

感謝您的信息。是否使用REST比單純輪詢服務器更好/不同?什麼是資源(電池和帶寬)打擊看起來像?而這只是我不喜歡蘋果的另一個原因:) – Eliezer 2012-03-16 19:41:21

+0

輪詢服務器會非常快地殺死你的電池,更不用說帶寬使用了。永久性的TCP連接只是在後臺佔用不多的資源。如果AppEngine不允許運行套接字服務器,則REST用於連接AppEngine和套接字服務器。設備和套接字服務器之間沒有REST,它基於TCP。在持續的連接中,電池的打擊可能微乎其微。至少這就是我在HTC Evo Android 2.3.4和我的黑莓上所經歷的。在iPhone上沒有統計數據(它不可能在iPhone上嘆息....) – openmobster 2012-03-16 19:56:17

+0

如果這有助於您查看一些示例代碼來執行持久性TCP連接。幾個鏈接:http://openmobster.googlecode.com/svn/trunk/cloud/android/connection/src/main/java/org/openmobster/core/mobileCloud/android/module/connection/NotificationListener.java和http ://openmobster.googlecode.com/svn/trunk/cloud/android/connection/src/main/java/org/openmobster/core/mobileCloud/android/module/connection/NetSession.java – openmobster 2012-03-16 19:59:30

0

我寧願不要HTTP連接,你應該創建TCP/IP隧道,並使通信快速和可靠。我有一個使用TCP/IP爲我運行perfact的聊天應用程序。如果你使用它,你將在多個平臺上擁有相同的邏輯。只有你需要編寫的是iOS和Android的不同代碼。

+0

有這個問題,據我知道你不能做到這一點AppEngine上。 – Eliezer 2012-03-15 15:01:24

+0

是的。在appengine中,您只能執行http或https服務器。然後去拉機制。我也使用Pull機制開發了一個應用程序。到目前爲止沒有問題。因爲我不知道Android C2DM與應用程序引擎的連接。如果是,那麼最好是利用C2DM – 2012-03-17 16:01:12