即時通信技術(IM)支持用戶在線實時交談。若是要發送一條信息,用戶須要打開一個小窗口,以便讓用戶及其朋友在其中輸入信息並讓交談雙方都看到交談的內容。大多數經常使用的即時通信發送程序都會提供各類各樣的功能javascript
可擴展通信和表示協議(XMPP):用於流式傳輸準實時通訊、表示和請求 - 響應服務等的 XML 元素。XMPP 基於 Jabber 協議,是用於即時通信的一個開放且經常使用的協議。儘管 XMPP 沒有被任何指定的網絡架構所融合,它仍是常常會被用於客戶機 / 服務器架構當中,客戶機須要利用 XMPP 協議經過 TCP 鏈接來訪問服務器,而服務器也是經過 TCP 鏈接進行相互鏈接。 html
即時通信對話初始協議和表示擴展協議(SIMPLE):SIMPLE 協議爲 SIP 協議指定了一整套的架構和擴展方面的規範,而 SIP 是一種網際電話協議,可用於支持 IM /消息表示。SIP 可以傳送多種方式的信號,如 INVITE 信號和 BYE 信號分別用於啓動和結束會話。 SIMPLE 協議在此基礎上還增長了另外一種方式的請求,即 MESSAGE 信號,可用於發送單一分頁的即時通信內容,即分頁模式的即時通信。SUBSCRIBE 信號用於請求把顯示信息發送給請求者,而 NOTIFY 信號則用於傳輸顯示信息。較長 IM 對話的參與者們須要傳輸多種的延時信息,它們使用 INVITE 和一個叫作消息會話中繼協議(MSRP)。與 SIMPLE 協議結合,MSRP 協議可用於 IM 的文本傳輸,正如與 SIP 協議相結合,RTP 協議就能夠用於傳輸 IP 電話中的語音數據包同樣。 java
Jabber: Jabber 是一種開放的、基於 XML 的協議,用於即時通信消息的傳輸與表示。國際互聯網中成千上萬的服務器都使用了基於 Jabber 協議的軟件。Jabber 系統中的一個關鍵理念是 「傳輸」,也叫作「網關」,支持用戶使用其它協議訪問網絡 — 如 AIM 和 ICQ、MSN Messenger 和 Windows Messenger、SMS 或 E-mail。 android
即時通信通用結構協議(CPIM):CPIM 定義了通用協議和消息的格式,即時通信和顯示服務都是經過 CPIM 來達到 IM 系統中的協做。 git
網際轉發聊天協議(IRCP):IRCP 支持兩個客戶計算機之間、一對多(所有)客戶計算機和服務器對服務器之間的通訊。該協議爲大多數網際即時通信和聊天系統提供了技術基礎。IRC 協議在 TCP/IP 網絡系統中已經獲得了開發,儘管沒有需求指定這是 IRC 協議的惟一操做環境。IRC 協議是一種基於文本的協議,使用最簡單的客戶端程序就可做爲其鏈接服務器的接口(socket)程序。 github
設計基於開源的XMPP即時通訊協議,採用C/S體系結構,經過GPRS無線網絡用TCP協議鏈接到服務器,以架設開源的Openfn'e服務器做爲即時通信平臺。 算法
系統主要由如下部分組成: spring
客戶端基於Android平臺進行開發。負責初始化通訊過程,進行即時通訊時,由客戶端負責向服務器發起建立鏈接請求。系統經過GPRS無線網絡與Internet網絡創建鏈接,經過服務器實現與Android客戶端的即時通訊。 數據庫
服務器端則採用Openfire做爲服務器。容許多個客戶端同時登陸而且併發的鏈接到一個服務器上。服務器對每一個客戶端的鏈接進行認證,對認證經過的客戶端建立會話,客戶端與服務器端之間的通訊就在該會話的上下文中進行。 安全
參考: http://www.ithao123.cn/content-1494500.html
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對象轉發至該模塊,從而實現路山轉發的功能