http://blog.csdn.net/axi295309066/article/details/53180628html
版權聲明:本文爲博主原創文章,未經博主容許不得轉載。android
消息推送,即時通訊,目的:想辦法讓服務器可以及時的通知客戶端服務器
消息推送最簡單的方法就是使用第三方的,好比如今使用比較多的是小米推送、極光推送,消息推送的技術原理是:移動無線網絡長鏈接微信
客戶端每隔必定的時候就向服務器發出請求,得到最新的信息。特色:markdown
應用場景:當服務器端的數據以固定的頻率更新,好比 股票行情。網絡
特色:效率高,最及時,同時,費用也是最高的。
應用場景:比較土毫的作法,不差錢。微信開發
AndroidPN ( Android push notify) app
小米推送,百度推送、極光推送、個推、微信推送socket
實現方式3和4原理上都屬於消息推送。
消息推送 的實現原理:Socket長聯接 + 心跳楨
XMPP 網絡上開源的,用於網絡聊天的網絡協議
asmack.jar jar包是對xmpp協議的實現
客戶端輪詢(客戶端定時主動拉取數據), 浪費流量, 浪費性能
谷歌推送服務(不能用,被牆了)
由於手機平臺自己、電量、網絡流量的限制,移動互聯網應用在設計上跟傳統PC 上的應用很大不同,須要根據手機自己的特色,儘可能的節省電量和流量,同時又要儘量的保證數據能及時到達客戶端。爲了解決數據同步的問題,在手機平臺上,經常使用的方法有2種。
一種是定時去服務器上查詢數據,也叫Polling,還有一種手機跟服務器之間維護一個TCP 長鏈接,當服務器有數據時,實時推送到客戶端,也就是咱們說的Push。從耗費的電量、流量和數據送達的及時性來講,Push 都會有明顯的優點,但Push 的實現和維護成本相對較高。在移動無線網絡下維護長鏈接,相對也有一些技術上的難度
由於IP v4 的IP 量有限,運營商分配給手機終端的IP 是運營商內網的IP,手機要鏈接Internet,就須要經過運營商的網關作一個網絡地址轉換(Network Address Translation,NAT)。簡單的說運營商的網關須要維護一個外網IP、端口到內網IP、端口的對應關係,以確保內網的手機能夠跟 Internet 的服務器通信。
對於大部分移動無線網絡運營商都在鏈路一段時間沒有數據通信時,會淘汰NAT 表中的對應項,形成鏈路中斷。
爲了避免讓NAT 表失效,咱們須要定時的發心跳,以刷新NAT 表項,避免被淘汰。Android 上定時運行任務經常使用的方法有2種,一種方法用Timer,另外一種是AlarmManager。
Android 的Timer 類能夠用來計劃須要循環執行的任務,Timer 的問題是它須要用WakeLock 讓CPU 保持喚醒狀態,這樣會大量消耗手機電量,大大減短手機待機時間。這種方式不能知足咱們的需求。
AlarmManager 是Android 系統封裝的用於管理RTC 的模塊,RTC (Real Time Clock) 是一個獨立的硬件時鐘,能夠在CPU 休眠時正常運行,在預設的時間到達時,經過中斷喚醒CPU。這意味着,若是咱們用AlarmManager 來定時執行任務,CPU 能夠正常的休眠,只有在須要運行任務時醒來一段很短的時間。極光推送的Android SDK 就是基於這種技術實現的。
當有大量的手機終端須要與服務器維持長鏈接時,對服務器的設計會是一個很大的挑戰。假設一臺服務器維護10萬個長鏈接,當有1000萬用戶量時,需 要有多達100臺的服務器來維護這些用戶的長鏈接,這裏還不算用於作備份的服務器,這將會是一個巨大的成本問題。那就須要咱們儘量提升單臺服務器接入用 戶的量,也就是業界已經討論好久了的C10K 問題。
上面只是針對極光推送來講,下面是具體的消息推送的通常有的方式:
在Android平臺上,你能夠經過攔截SMS消息而且解析消息內容來了解服務器的意圖,能夠實現徹底的實時操做。可是問題是這個方案的成本相對比較高,且依賴於運營商
這種方法須要客戶端來作一個定時或者週期性的訪問服務器端接口,以得到最新的消息。輪詢的頻率太慢可能致使某些消息的延遲,太快則會大量消耗網絡帶寬和電池
這個方案能夠解決由輪詢帶來的性能問題,可是仍是會消耗手機的電池。咱們須要開一個服務來保持和服務器端的持久鏈接(蘋果就和谷歌的C2DM是這種 機制)。可是對於Android系統,當系統可用資源較低,系統會強制關閉咱們的服務或者是應用,這種狀況下鏈接會強制中斷。(Apple的推送服務之所 以工做的很好,是由於每一臺手機僅僅保持一個與服務器之間的鏈接,事實上C2DM也是這麼工做的。即全部的推送服務都是經由一個代理服務器完成的,這種情 況下只須要和一臺服務器保持持久鏈接便可。C2DM=Cloud to Device Messaging)。
相比之下第三種仍是最可行的。爲軟件編寫系統服務或開機啓動功能;或者若是系統資源較低,服務被關閉後能夠在onDestroy ()方法裏面再重啓該服務,進而實現持久鏈接的方式。
C2DM內置於Android的2.2系統上,沒法兼容老的1.6到2.1系統;且依賴於Google官方提供的C2DM服務器,因爲國內的網絡環境,這個服務常常不可用。
創建在TCP協議之上的XMPP協議,不只可提供可這種持久鏈接的功能,能實現服務器和客戶機的雙工通訊,還能不依賴與系統版本和google服務器的限制,提供了比較好的解決方案。
目前用的最多的,也是最穩定消息推送服務,http://dev.xiaomi.com/console/appservice/push.html