基於XMPP 協議的開發 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資料流。根據解析元素不同類型封裝成不同的資料對象:資料模組定義整個用戶端中大部分的資料類型和對象;應用模組包括即時通訊、圖片瀏覽和音樂播放。是用戶端和使用者交流的介面;加密模組對發送和接收的訊息進行加解密。以確保通訊資料的安全
通訊模組負責與伺服器建立通訊舊。通過建立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對象轉寄至該模組,從而實現路山轉寄的功能。