天天看點

基于XMPP協定的Android即時通信系

設計基于開源的xmpp即時通信協定,采用c/s體系結構,通過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

manager。sessionmanager負責管理用戶端與伺服器之間的會話,auth manager負責用戶端使用者認證管理,presence

manager負責管理用戶端使用者的登入狀态,notificationmanager負責實作伺服器向用戶端推送消息功能。

       系統用戶端基于android手機平台。采用xmpp作為即時通訊協定。xmpp是基于xml,實作任意兩個網絡終端準實時的交換結構化資訊的通信協定。采用android平台提供的xml解析包對xml進行解析。由于應用活動都運作于主線程。故用多線程技術來解決系統通訊問題。針對通信安全問題.系統的使用者資訊和聊天資訊在用戶端存儲在android平台自身所帶的sqlite資料庫中,多媒體檔案和圖檔檔案存儲在android平台虛拟檔案儲存設備sd

card中。

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

基于XMPP協定的Android即時通信系

       通訊子產品負責與伺服器建立通訊舊。通過建立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協定的Android即時通信系

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

基于XMPP協定的Android即時通信系

對圖說明:

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

基于XMPP協定的Android即時通信系

資料子產品負責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對象轉發至該子產品,進而實作路山轉發的功能。

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

繼續閱讀