(文中部分內容來自網絡)
XMPP協議:
XMPP : The Extensible Messaging andPresence Protocol.
中文全稱:可擴展通訊和表示協議.
簡介:可擴展通訊和表示協議 (XMPP) 可用於服務類實時通訊、表示和需求響應服務中的XML數據元流式傳輸。
XMPP(可擴展消息處理現場協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。
它在促進服務器之間的准即時操作。這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息,即
使其操作系統和瀏覽器不同。
XMPP主要顯著的優點主要有以下幾個方面:
1、分布式 任何人都可以運行自己的XMPP服務器,它沒有主服務器,客戶端簡單
2、安全性很高。使用SASL及TLS等技術的可靠安全性
3、開發性 它是開源的,易於進行學習和了解
4、跨平台 毋庸置疑,使用的XML數據格式進行傳輸的
Androidpn :android pushnotification(中文名稱:Android消息推送)。
基於XMPP協議的java開發有一個開源框架,那就是smack,它主要封裝了一些XMPP的實現。在引用smack的基礎上
實現和服務器端的持久連接,以實現服務器對客戶端的推送,那就是Androidpn。Androidpn在客戶端集成了smack。
這樣就可以很容易的簡立一個和服務器端的基於xmpp協議的socket連接。所以Androidpn可以說是使用了smack框架
的開源項目。
Androidpn使用好處:
用Androidpn好處有以下方面:采用完全開放的XMPP協議進行數據傳輸(QQ,MSN,GTalk等都是采用的這種協議)。
良好的框架支持(專門為android 而產生的推送框架smack,以及很好的管理socket的框架MINA,都是很成熟的產品);
完全開放的源代碼(我們可以在Androidpn的基礎上進行修改,來滿足我們的任何需求變更);大大的減少了客戶端的代
碼,降低了android的開發難度。
Androidpn技術實現:
(這里就不說下載源碼后怎么操作了,網上教程頗多)
客戶端與服務器建立socket連接。
Androidpn客戶端,進行管理連接的信息,比如XMPP的端口、IP(域名)、登錄的用戶名密碼,以及對連接的維護(定時的
發送連接請求保持連接不失效)。整個服務器端和客戶端的通信是基於一個session(會話)過程,會話開始,首先會
指定服務器的端口號,然后把信息發送到服務器端;而向服務器發送消息:<stream>根節點的方式開始傳遞,只有在服
務器和客戶端關閉的時候才會發送它的結束標記</stream>。以客戶端通過XMPP協議只用做的就是接收消息,而所有
其它的操作都交給服務器,比如管理連接、消息保存等等,這樣就很大程度的減輕了客戶端的負擔。
Androidpn服務器端,Androidpn主要用到的技術是Spring和Hibernate。保存用戶信息到數據庫並做驗證,主要是用來
展示用戶狀態和發送信息用的。在服務器關閉的時候,發送一個</stream>標記到客戶端,告知連接斷開,客戶端需重
新連接。管理Socket連接的時候,Androidpn采用了MINA框架來進行管理,MINA的優點就是改變了我們傳統的管理socket的方式,比如每建立一個socket開一個線程,而MINA
可以實現多個線程管理N多個用戶(這句不是太明白,
誰知道給留個言說下,萬分感謝)。在處理高並發的推送上無疑是有巨大的好處的。
在數據傳輸過程中,信息處理采用XML節的方式傳遞信息,消息封裝通常采用IQ(Info/Query)、Message(消息)、
Presence(在線狀態探測)。
但是Androippn中好像沒有用到Message(也許我理解錯誤),從Server到Client和Client到Server都用的IQ封裝。
除此之外,xml的傳遞過程還有type可為set、get、result、error四種類型,我個人理解是:set指請求更新(改變)處理
(如從Server推送消息到client、注冊用戶),get指獲取數據(如取好友列表),result是指請求更新后給client的應答
(如登錄是否成功得告訴Client,見ClientSession中的createSession()方法),error就明顯了指錯誤,一般是指告訴Client斷開
連接。
長連接和重連:
1. 客戶端第一次連接服務器建立的是一個socket連接,如果服務器需要關閉返回</stream>或者一個表示ERROR的
流返回給客戶端,客戶端將啟動定時重連線程。
2. 本地連接服務器失敗后將啟動定時重連線程。
3. 本地監聽網絡信息,如果網絡不可用,也將啟動重連線程。
4. 連接成功后,監聽socket連接狀態,如果斷開,啟動重連線程。
注:1)據說防火牆可能會關閉非活動狀態的連接,所以又據說建立連接后會向服務器發送心跳(keepLive)。
主要文件作用:
客戶端:
DemoAppActivity 程序入口Activity
ServiceManager 服務管理器,控制后台服務的啟動和停止
NotificationService 初始化廣播,並注冊廣播; 初始化線程發送開始連接廣播等其它
XmppManager 定義調用asmack庫的方法,做連接及其它。
ConnectivityReceiver 連接廣播接收者,調用XmppManager的連接方法
PersistentConnectionListener 重連監聽,由asmack調用,在連接時被注冊
PhoneStateChangeListener 手機連接狀態監聽,服務啟動時被注冊
NotificationIQProvider 通知消息提供者,由asmack庫調用,並接收到服務器返回的消息(xml)
NotificationPacketListener 通知消息監聽器,在連接后被注冊,由asmack庫調用,當NotificationIQProvider接收
到服務器消息后,會調用監聽器的回調方法processPacket,再發送廣播給NotificationReceiver
NotificationReceiver 通知廣播接收者,調用Notifier中的通知方法
Notifier 調用notify方法界面通知。
注:NotificationIQProvider中parseIQ()方法解析服務器發送的xml數據並封裝成實體。
服務器:
org.androidpn.server.xmpp 包里面定義了一些異常類型,主要是包含有入口類XmppServer,這個類用來啟動和停止server程序。
org.androidpn.server.xmpp.auth 包里面是認證的一些類,我們自己的認證模塊可以在這里與androidpn進行結合。
org.androidpn.server.xmpp.codec 是XMPP協議的XML文件解析包,server收到和發送的消息都要通過這個包來進行xmpp協議編碼和解碼。
org.androidpn.server.xmpp.handler 包主要是對消息的處理,我們可以針對不同的消息類型定義自己的handler,可在這包在類中處理客戶端發送的數據
org.androidpn.server.xmpp.net 包負責維護與client之間的持久連接,並實現了一些傳輸方式供發送xmpp消息時使用。
org.androidpn.server.xmpp.presence 里面只包含PresenceManager類,用來維護client的在線狀態。
org.androidpn.server.xmpp.push 里面只有一個NotificationManager類包含有向client發送消息的接口,可自己封裝需要的數據發送到客戶端。
org.androidpn.server.xmpp.session包定義了用來表示持久鏈接的session,每個session包含一條連接的狀態信息。用戶管理所有會話,比如連接斷開,刪除session以及建立連接,添加session等等。
org.androidpn.server.xmpp.ssl是對連接進行ssl認證的工具包。
注: 以上紅色包中,NotificationManager(org.androidpn.server.xmpp.push)帶着username和message
到Session(org.androidpn.server.xmpp.session)類中找到相應的session, 並封裝成xml格式,再調用
Connection(org.androidpn.server.xmpp.net)中的deliver()方法給相應用戶發送數據達到通信。