From:http://blog.csdn.net/lganggang131/article/details/7441854
最近手頭一個項目中需要用到消息推送,查了又蠻多資料,感覺這篇寫的最好,感謝無私奉獻的人,紅色字體爲我自己加上的部分
關於服務器端向Android客戶端的推送,主要有三種方式:輪詢,應用程序應當階段性的與服務器進行連接並查詢是否有新的消息到達,你必須自己實現與服務器之間的通信,例如消息排隊等。而且你還要考慮輪詢的頻率,如果太慢可能導致某些消息的延遲,如果太快,則會大量消耗網絡帶寬和電池;SMS(通過發送短信並解析短信內容來獲取服務器端的指令),這個出現的問題是很難找到免費的網關來發送短信;最後就是持久連接,主要是Socket通訊,這個解決了性能問題,但是耗電問題依舊沒能解決。
在這裏,我們主要介紹的是第三種,用持久連接的方式來進行推送。現在比較成熟的及時消息傳遞協議共有四種,而無疑最爲主流就是XMPP協議,它是一種基於XML的傳遞協議,具有很強的靈活性和可擴展性。它的特點是將複雜性從客戶端轉移到了服務器端。在網上可以找到很多的XMPP資料,這裏就不在贅述了,不然越扯越多。總之,XMPP主要顯著的優點主要有以下幾個方面:
1、 分佈式 任何人都可以運行自己的XMPP服務器,它沒有主服務器
2、 安全性很高。使用SASL及TLS等技術的可靠安全性
3、 開發性 它是開源的,易於進行學習和了解
4、 跨平臺 毋庸置疑,使用的XML進行傳輸的
說完優點,我們言歸正傳,基於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又做了什麼呢?
服務器端的展示方面,androidpn主要用到的技術是Spring和Hibernate。主要是用來展示用戶狀態和發送信息用的,如下圖:
這方面的技術已經比較成熟,就不再細說了,主要要說的還是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好處有以下方面:
(1)、採用完全開放的XMPP協議進行數據傳輸(QQ,MSN,GTalk等都是採用的這種協議);
(2)、良好的框架支持(專門爲android 而產生的推送框架asmack,以及很好的管理socket的框架MINA,都是很成熟的產品);
(3)、完全開放的源代碼(我們可以在androidpn的基礎上進行修改,來滿足我們的任何需求變更);
大大的減少了客戶端的代碼,降低了android的開發難度。
缺點不言而喻,使用了太多的框架,如果想要改一些具體的實現,可能會牽一髮動全身。不過如果你個懶人的話,完全滿足你的需求了。
最後是我整理的androidpn的源碼,完全可以使用。原來的服務器端用的jetty框架來代替tomcat的,我把它又重新整合到了tomcat下,可以完美的和你的服務器端融合。懶人們,來吧~~由於文件過大,所以用了外連~~喜歡的就去下載吧。。只需要改下client的raw文件夾下的ip地址就可以運行。。androidpn下載地址
本文轉載自:http://www.iteye.com/topic/1117043#2266007
如果需要使用輪詢方式,則可以使用handler實現,很簡單如下
private boolean isRunning = true;
private final int LOOP = 1;
public Handler handler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case LOOP:
//1、業務邏輯處理代碼
if(isRunning){
//2、向服務器請求數據代碼
Message message = obtainMessage(LOOP);
break;
}
}
}
}