閱讀1011 返回首頁    go 阿裏雲 go 技術社區[雲棲]


基於XMPP協議的Android即時通信係

設計基於開源的XMPP即時通信協議,采用CS體係結構,通過GPRS無線網絡用TCP協議連接到服務器,以架設開源的Openfn'e服務器作為即時通訊平台。

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

 

客戶端:

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


服務器端:

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

 

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

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

       主要的四個組成部分分別是SessionManager,Auth Manager,PresenceManager以及Notification ManagerSessionManager負責管理客戶端與服務器之間的會話,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鏈路在長時間無有數據流量時。會自動降低此鏈路的優先級直至強製斷開此鏈路。所以在應用中.采用發送心跳的方式來維持此鏈路。

 數據格式

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

 協議消息格式

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

後台Servic

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

對圖說明:

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

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



       需要客戶端源碼的朋友可以去我的資源裏找,或者本博文係列的最後一篇有地址。服務端源碼不能給,那是公司的東西,抱歉!不要再問了哈

最後更新:2017-04-03 12:55:03

  上一篇:go 安卓作品:河北空氣質量客戶端
  下一篇:go 吐槽Visual Studio 2010