(文中部分内容來自網絡,如無意中侵犯了版權,請告之!)
XMPP協定:
XMPP : The Extensible Messaging andPresence Protocol.
中文全稱:可擴充通訊和表示協定.
簡介:可擴充通訊和表示協定 (XMPP) 可用于服務類實時通訊、表示和需求響應服務中的XML資料元流式傳輸。
XMPP(可擴充消息處理現場協定)是基于可擴充标記語言(XML)的協定,它用于即時消息(IM)以及線上探測。
它在促進伺服器之間的準即時操作。這個協定可能最終允許網際網路使用者向網際網路上的其他任何人發送即時消息,即使其作業系統和浏覽器不同。
XMPP主要顯著的優點主要有以下幾個方面:
1、分布式 任何人都可以運作自己的XMPP伺服器,它沒有主伺服器,用戶端簡單
2、安全性很高。使用SASL及TLS等技術的可靠安全性
3、開發性 它是開源的,易于進行學習和了解
4、跨平台 毋庸置疑,使用的XML資料格式進行傳輸的
Androidpn:
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技術實作:
androidpn配置:
1.啟動伺服器 androidpn-server-0.5.0in
un.bat
由于伺服器端是使用Jetty做為web容器,是以預設的通路路徑是http://127.0.0.1:7070/indexuser.do 。
2.将androidpn-client-0.5.0.zip 解壓後導入Android工程項目,将androidpn-client-0.5.0
es
awandroidpn.properties 的xmppHost=192.168.**.** 修改為你自己的伺服器端IP,然後生成APK安裝包。當伺服器端檢測到你的用戶端以後,你就可以向該手機發送通知了。
用戶端與伺服器建立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)。
主要檔案作用:
(1)、 用戶端:
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資料并封裝成實體。
(2)、伺服器:
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()方法給相應使用者發送資料達到通信。
示例代碼下載下傳連結:http://download.csdn.net/detail/klcf0220/6806851
官網源碼下載下傳連結:http://sourceforge.net/projects/androidpn/files/
參考連結:http://blog.csdn.net/sgz_china/article/details/8722626