Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 基於XMPP 協議的開發 android

基於XMPP 協議的開發 android

編輯:關於Android編程

設計過一款基於開源的XMPP即時通信協議的軟件,采用C/S協議,通過GPRS無線網絡用TCP協議到服務器,以架設開源的Openfire 服務器作為即時通訊平台

系統主要由以下部分組成:一是:服務器,負責管理發出的鏈接或者其他實體的會話,接收或轉發XML 數據給客戶端,它與服務器鏈接,通過XMPP協議獲得由服務器或任何其它相關的服務鎖提供的全部功能,三是協議網關的信息與外部消息系統可是不信息間的翻譯,再就是XMPP網絡,實現各個服務 客戶端間的鏈接,系統采用客戶端 服務器端架構體系架構

 

客戶端:

客戶端基於android 平台進行開發,負責初始化通信過程,進行即時通信由客戶端向服務器創建鏈接的請求,通過服務器實現與Android客戶端的即時通信腳。

服務器端:

服務器端采用Openfire 作為服務器端,允許多個客戶端同時登錄並發的鏈接到一個服務器上,服務器對每個客戶端的鏈接進行認證,對認證通過的客戶端創建會話,客戶端與服務器端之間的通信就在該會話的上下文中進行

 

Android 服務端設計

androidpn 服務端是Java 語言實現的,基於openfire 開源工程,Web 部分采用的是Spring 框架,這一點與openfire是不同的,androidpn 服務器包含兩個部分,一個是監聽特定端口上的XMPP服務,負責與客戶端的XMPPConnection 類進行通信,作用是用戶注冊和身份認證,並發送推送通知消息,分別數SessionManager Auth Manager PresenceManager 以及Notification Manager SessionManager 負責管理客戶端與服務器端的會話,采用輕量級的HTTP 服務器,負責接收用戶的web請求,

主要的四個組成部分,分別是SessionManager AuthManager PresenceManager 以及Notification Manager

SessionManager 負責管理客戶端與服務器之間的會話,AuthManager 負責客戶端用戶認證管理,Presence Manager 負責管理Auth Manager負責客戶端用戶認證管理,Presence Manager負責管理客戶端用戶的登錄狀態,NotificationManager負責實現服務器向客戶端推送消息功能。

 

 

系統客戶端基於Android手機平台。采用XMPP作為即時通訊協議。XMPP是基於XML,實現任意兩個網絡終端准實時的交換結構化信息的通信協議。采用Android平台提供的XML解析包對XML進行解析。由於應用活動都運行於主線程。故用多線程技術來解決系統通訊問題。針對通信安全問題.系統的用戶信息和聊天信息在客戶端存儲在Android平台自身所帶的SQLite數據庫中,多媒體文件和圖片文件存儲在Android平台虛擬文件存儲設備SD Card中。

 

通訊模塊負責與服務器建立通訊舊。通過創建3個線程來進行處理。分別負責消息的發送、接收和心跳信息的發送;解析模塊主要用來解析XML數據流。根據解析元素不同類型封裝成不同的數據對象:數據模塊定義整個客戶端中大部分的數據類型和對象;應用模塊包括即時通信、圖片浏覽和音樂播放。是客戶端和用戶交流的接口;加密模塊對發送和接收的消息進行加解密。以確保通訊數據的安全

data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316334199.jpg

 

 

 

通訊模塊負責與服務器建立通訊舊。通過創建3個線程來進行處理。分別負責消息的發送、接收和心跳信息的發送;解析模塊主要用來解析XML數據流。根據解析元素不同類型封裝成不同的數據對象:數據模塊定義整個客戶端中大部分的數據類型和對象;應用模塊包括即時通信、圖片浏覽和音樂播放。是客戶端和用戶交流的接口;加密模塊對發送和接收的消息進行加解密。以確保通訊數據的安全。

加密(首先將二進制碼轉換成BASE64碼,在轉換成BASE64碼之後,再進行MD5加密,)

 

XMPP服務器之間、客戶與服務器之間采用的是TCP連接罔。TCP提供一種瓦向連接、可靠的字節流服務。保持一個實時雙向的傳輸通道。TCP將用戶數據打包構成報文段。它發送數據後啟動一個定時器,等待對端數據確認,另一端對收到的數據進行確認,對失序的數據重新排序,並丟棄重復數據;TCP提供端到端的流量控制。計算和驗證一個強制性的端到端檢驗。但是GPRS網絡對TCP鏈路存在一個限制。當TCP鏈路在長時間無有數據流量時。會自動降低此鏈路的優先級直至強制斷開此鏈路。所以在應用中.采用發送心跳的方式來維持此鏈路。


 

數據格式

 

XML是XMPP系統架構的核心。它能表述幾乎任何一種結構化數據。特別是XMPP利用XML數據流進行客戶端一服務器端、服務器端一服務器端的通信。XML數據流一般是由客戶端發起至服務端,XML數據流的有效時間直接與用戶的在線會話有效時間相關聯。


 

協議消息格式

 

XMPP協議包括3個頂層XML元素:Message、Presence和IQm。Message用來表示傳輸的消息,當用戶發送一條消息時。就會在流的上下文中插入一個Message元素,中間有用戶發送的相關信息;Presence用來表示用戶的狀態。當用戶改變自己的狀態時。就會在數據流的上下文中插入一個Presence元素,用來表示用戶現在的狀態;IQ用來表示一種請求,響應機制,從一個實體發送請求,另外一個實體接受請求並響應。

 

後台Servic:


data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316334103.jpg

 

 

從類的層次看這個結構比較簡單,讓其變得復雜的是,其裡面有三個線程:主線程,進行Xmpp通信線程,連接出錯重試線程。

data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316334157.jpg

 

 

對圖說明:

1. 在NotificationService裡創建一個單線程,讓其對服務器進行連接,由於使用Xmpp連接服務器要分為三步:連接,注冊,登陸。所以用一個棧來保存要執行的Task任務(ConnectTask,RegisterTask,LoginTask),還後再按這個順序進行執行。

2. 連接Xmpp服務器的線程用的是Executors.newSingleThreadExecutor(),這個本身可以不停的submit任務。為什麼還要自己用一個棧來保存Task了

3. 連接線程在連接,注冊,登陸的過程中,都有可能出錯,都可能會失敗,這時我就要有一個重連的機制,在Androidpn裡開了另外一個線程來進行重試,其重試不是每次都按多少秒來進行重試,而是有其自己的規則。

4. 在LoginTask裡,如果登陸了服務器端,其就會注冊一個監聽器,用於監聽服務器push的數據包(Packet),再通過發送廣播的方式來通知要進行顯示的程序。

5. 在登陸服務器後,也有可能出錯,所以在登陸後,會設置一個ConnectionListener,用於監聽連接出錯的時候,再合適重連線程,進行重連

6. 在登陸過程中,有一種錯誤要單獨處理,就是賬號和密碼無效的時候,這個時候其返回的狀態碼是401,這種情況應該把本地保存的帳號和密碼都清掉,再重新進行連接,不然會永遠都登陸不上服務器端。

 

由於該系統所有的功能實現都是基於網絡間的XML流的通信,所以,需要有一個模塊專門負責網絡問通信和XML流的處理,主要功能包括服務器和客戶端之問通信時TCP套接字的處理,XML流的解析、存儲等功能。


 

data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316334174.jpg

 

 

數據模塊負責XML流的解析和封裝的XML模塊,主要功能是:將XML流解析成java對象,將iava對象封裝成XML流;

其流程是XMPP服務器接收到XML流之後,會有渎取器將其讀取出來並將其作為入口參數傳入XML解析器,XML解析器通過對其命名空間的解析,從而確定將剩余的XML元素解析出來並傳入相應的;ava對象中,從而最終將XML轉換成iava對象,然後將iava對象傳入應用程序模塊中,實現其請求完成的功能並返回iava對象,但是該iava對象不能在網絡中直接傳輸,必須先轉換成XML節,於是,該iava對象會被傳入XML封裝器中,被封裝成XML節,通過XMPP服務器的發送端口發往目的節點。

java對象處理模塊處理流程如下:當該模塊接收到iava對象時,會先將該對象通過解密算法和解密密鑰解密成base64碼,然後f耳將base64碼轉換成二進制碼,從而實現對java對象的解析。當完成業務邏輯處理後,該模塊會將返回的java對象先由二進制碼轉換成base64碼,然後用加密算法將其加密,這裡的加密算法是由雙方在建立會話時通過三次握手協議協商的。

當XML節被封裝成java對象後,必須被轉發至訂:確的模塊中加以處理,這就要求有一個路由轉發模塊,如圖3—3所示。該模塊的實現原理是:在系統啟動時加載該路由模塊,從而在內存中創建了一塊路由模塊,記錄了命名空和功能模塊之間的對應關系,當iava對象被封裝好之後,系統會讀出其命名空間,再在路由表中查找其所對應的模塊,從而動態地加載該模塊,並將該java對象轉發至該模塊,從而實現路山轉發的功能。

 

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved