基於XMPP協議的Android即時通訊系(http://blog.csdn.net/lnb333666/article/details/7471292)

之前作過一個基於XMPP協議的聊天社交軟件,總結了一下。發出來。java

      設計基於開源的XMPP即時通訊協議,採用C/S體系結構,經過GPRS無線網絡用TCP協議鏈接到服務器,以架設開源的Openfn'e服務器做爲即時通信平臺。mysql

         系統主要由如下部分組成:一是服務器,負責管理髮出的鏈接或者與其餘實體的會話,接收或轉發XML(ExtensibleMarkup Language)流元素給受權的客戶端、服務器等;二是客戶終端。它與服務器相連,經過XMPP得到由服務器或任何其它相關的服務所提供的所有功能。三是協議網關。完成XMPP協議傳輸的信息與外部消息系統可識別信息間的翻譯。再就是XMPP網絡。實現各個服務器、客戶端間的鏈接。系統採用客戶端(Client)/服務端(Server)架構體系結構。android

 

客戶端:算法

        客戶端基於Android平臺進行開發。負責初始化通訊過程,進行即時通訊時,由客戶端負責向服務器發起建立鏈接請求。系統經過GPRS無線網絡與Internet網絡創建鏈接,經過服務器實現與Android客戶端的即時通訊腳。spring


服務器端:sql

       服務器端則採用Openfire做爲服務器。容許多個客戶端同時登陸而且併發的鏈接到一個服務器上。服務器對每一個客戶端的鏈接進行認證,對認證經過的客戶端建立會話,客戶端與服務器端之間的通訊就在該會話的上下文中進行。數據庫

 

1.1服務器端設計(這塊幾乎能夠說是有成品了。不用多糾結)安全

        androidpn服務器端是Java語言實現的,基於openfire開源工程,Web部分採用的是spring框架,這一點與openfire是不一樣的。Androidpn服務器包含兩個部分,一個是監聽特定端口上的XMPP服務,負責與客戶端的XMPPConnection類進行通訊,做用是用戶註冊和身份認證,併發送推送通知消息。另一部分是Web服務器,採用一個輕量級的HTTP服務器,負責接收用戶的Web請求。服務器

       主要的四個組成部分,分別是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager負責管理客戶端與服務器之間的會話,Auth Manager負責客戶端用戶認證管理,Presence Manager負責管理客戶端用戶的登陸狀態,NotificationManager負責實現服務器向客戶端推送消息功能。網絡

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

 

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

 

系統的客戶端分爲5大模塊進行設計開發,如圖2所示。

 

       通信模塊負責與服務器創建通信舊。經過建立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:

 

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

 

對圖說明:

  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流的解析、存儲等功能。

 

數據模塊負責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對象轉發至該模塊,從而實現路山轉發的功能。

相關文章
相關標籤/搜索