Androidpn 簡單實現及分析

(文中部份內容來自網絡)java

XMPP協議:android

 XMPP : The Extensible Messaging andPresence Protocol.數據庫

 中文全稱:可擴展通信和表示協議.瀏覽器

        簡介:可擴展通信和表示協議 (XMPP) 可用於服務類實時通信、表示和需求響應服務中的XML數據元流式傳輸。安全

XMPP(可擴展消息處理現場協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。服務器

它在促進服務器之間的準即時操做。這個協議可能最終容許因特網用戶向因特網上的其餘任何人發送即時消息,即網絡

使其操做系統和瀏覽器不一樣。session

 

XMPP主要顯著的優勢主要有如下幾個方面:併發

一、分佈式  任何人均可以運行本身的XMPP服務器,它沒有主服務器,客戶端簡單框架

二、安全性很高。使用SASL及TLS等技術的可靠安全性

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

四、跨平臺  毋庸置疑,使用的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技術實現:

(這裏就不說下載源碼後怎麼操做了,網上教程頗多)

客戶端與服務器創建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可爲setgetresulterror四種類型,我我的理解是: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()方法給相應用戶發送數據達到通訊。

相關文章
相關標籤/搜索