我正在構建一個多操作系統鏡像系統,我想使用混合客戶端服務器和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,但我想要一個可以跨平臺實現的解決方案。
我能想到的唯一的其他方法就是讓客戶端輪詢服務器的消息。儘管如此,這還是有電池和網絡消耗問題。
是否有其他方法可以實現這一點?如果不是,上述哪一種方法在平衡可用性,功耗和數據消耗以及用戶輸入方面是最好的(用戶需要做的越少,客戶端設置(即端口轉發等)越好)?請注意,我不打算讓這成爲討論/火焰戰爭,而是對事實的合理表述。
在此先感謝!
感謝您的信息。是否使用REST比單純輪詢服務器更好/不同?什麼是資源(電池和帶寬)打擊看起來像?而這只是我不喜歡蘋果的另一個原因:) – Eliezer 2012-03-16 19:41:21
輪詢服務器會非常快地殺死你的電池,更不用說帶寬使用了。永久性的TCP連接只是在後臺佔用不多的資源。如果AppEngine不允許運行套接字服務器,則REST用於連接AppEngine和套接字服務器。設備和套接字服務器之間沒有REST,它基於TCP。在持續的連接中,電池的打擊可能微乎其微。至少這就是我在HTC Evo Android 2.3.4和我的黑莓上所經歷的。在iPhone上沒有統計數據(它不可能在iPhone上嘆息....) – openmobster 2012-03-16 19:56:17
如果這有助於您查看一些示例代碼來執行持久性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