android中實現消息推送(轉)

關於服務器端向Android客戶端的推送,主要有三種方式:輪詢,應用程序應當階段性的與服務器進行鏈接並查詢是否有新的消息到達,你必須本身實現與服務器之間的通訊,例如消息排隊等。並且你還要考慮輪詢的頻率,若是太慢可能致使某些消息的延遲,若是太快,則會大量消耗網絡帶寬和電池SMS(經過發送短信並解析短信內容來獲取服務器端的指令),這個出現的問題是很難找到免費的網關來發送短信;最後就是持久鏈接,主要是Socket通信,這個解決了性能問題,可是耗電問題依舊沒能解決。java

在這裏,咱們主要介紹的是第三種,用持久鏈接的方式來進行推送。如今比較成熟的及時消息傳遞協議共有四種,而無疑最爲主流就是XMPP協議,它是一種基於XML的傳遞協議,具備很強的靈活性和可擴展性。它的特色是將複雜性從客戶端轉移到了服務器端。在網上能夠找到不少的XMPP資料,這裏就不在贅述了,否則越扯越多。總之,XMPP主要顯著的優勢主要有如下幾個方面:android

一、 分佈式  任何人均可以運行本身的XMPP服務器,它沒有主服務器安全

二、 安全性很高。使用SASLTLS等技術的可靠安全性服務器

三、 開發性 它是開源的,易於進行學習和了解網絡

四、 跨平臺  毋庸置疑,使用的XML進行傳輸的session

說完優勢,咱們言歸正傳,基於XMPP協議的java開發有一個開源框架,那就是smack,它主要封裝了一些XMPP的實現。而若是把它直接用在Android上是不行的,由於android缺乏了一些java的類庫,因而一個改進版的asmack誕生了,它是專門爲android而改進的android smack。而另一個開源框架的誕生,則是對在引用smack的基礎上實現和服務器端的持久鏈接,以實現服務器對客戶端的推送,那就是android push notification,簡稱androidpn併發

Androidpn在客戶端集成了asmack。這樣就能夠很容易的簡立一個和服務器端的基於xmpp協議的socket鏈接。Androidpn的客戶端中,進行管理鏈接的類是XmppManager,它主要用來管理鏈接的信息,好比XMPP的端口、IP、登陸的用戶名密碼,以及對鏈接的維護。爲何還有用戶名和密碼?這不得不提到XMPP的具體細節。整個服務器端和客戶端的通訊是基於一個session(會話)過程,會話開始,首先會指定服務器的端口號,而後把上述提到的信息發送到服務器端,怎麼發送消息的呢?以<stream>根節點的方式開始傳遞,只有在服務器和客戶端關閉的時候纔會發送它的結束標記</stream>。客戶端經過XMPP協議只用作的就是接收消息,而全部其它的操做都交給服務器,好比管理鏈接、消息保存等等,這樣就很大程度的減輕了客戶端的負擔。那麼客戶端和服務器端的消息迴應是如何實現的?如要經過一個ID來標識,具體細節能夠去查看XMPP協議。框架

一旦註冊綁定後,服務器端就和客戶端創建了鏈接,客戶端只用負責去接收消息。因此當咱們應用Androidpn的時候,客戶端會很是的簡單。而在服務器端,Androidpn又作了什麼呢?socket

服務器端的展現方面,androidpn主要用到的技術是SpringHibernate。主要是用來展現用戶狀態和發送信息用的,以下圖:分佈式

 



 

 

這方面的技術已經比較成熟,就再也不細說了,主要要說的仍是XMPP的管理。在服務器端的源碼中一個org.androidpn.server.xmpp.net.Connection類,主要是表明一個服務器上的XMPP鏈接,注意只是一個,它能夠確保在服務器關閉的時候,發送一個</stream>標記到客戶端,告知鏈接斷開,需從新鏈接。

org.androidpn.server.xmpp.session.SessionManager主要用戶管理全部會話,好比鏈接斷開,刪除session以及創建鏈接,添加session等等。

而在管理Socket鏈接的時候,androidpn採用了MINA框架來進行管理,MINA的優勢就是改變了咱們傳統的管理socket的方式,好比沒創建一個socket開一個線程,而MINA能夠實現多個線程管理N多個用戶。在處理高併發的推送上無疑是有巨大的好處的。

合理的利用監聽器來管理session,也是androidpn的優勢。在安全性方面,制定了TLS(安全傳輸層)策略,並卻採用了安全認證,這些方面都作的不錯。

固然,不可避免的30秒鐘的心跳包仍是必不可少的。

總之,用Androidpn好處有如下方面:採用徹底開放的XMPP協議進行數據傳輸(QQMSNGTalk等都是採用的這種協議);良好的框架支持(專門爲android 而產生的推送框架asmack,以及很好的管理socket的框架MINA,都是很成熟的產品);徹底開放的源代碼(咱們能夠在androidpn的基礎上進行修改,來知足咱們的任何需求變動);大大的減小了客戶端的代碼,下降了android的開發難度。缺點不言而喻,使用了太多的框架,若是想要改一些具體的實現,可能會遷移發動全身。不過若是你個懶人的話,徹底知足你的需求了。

相關文章
相關標籤/搜索