基于XMPP協議的Android即時通信系統
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
設計基于開源的XMPP即時通信協議,采用C/S體系結構,通過GPRS無線網絡用TCP協議連接到服務器,以架設開源的Openfire服務器作為即時通訊平臺。 系統主要由以下部分組成:一是服務器,負責管理發出的連接或者與其他實體的會話,接收或轉發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數據流。根據解析元素不同類型封裝成不同的數據對象:數據模塊定義整個客戶端中大部分的數據類型和對象;應用模塊包括即時通信、圖片瀏覽和音樂播放。是客戶端和用戶交流的接口;加密模塊對發送和接收的消息進行加解密。以確保通訊數據的安全。 系統的客戶端分為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對象轉發至該模塊,從而實現路山轉發的功能。 該文章在 2013/2/25 17:37:47 編輯過 |
關鍵字查詢
相關文章
正在查詢... |