?

基于XMPP協議的Android消息推送的分析與設計

2018-10-19 07:34
長沙大學學報 2018年5期
關鍵詞:服務端安卓通訊

彭 飛

(安徽信息工程學院計算機與軟件工程學院,安徽 蕪湖241000)

國內軟件開發和服務型企業,都在嘗試和提供消息推送服務.但是,對于專門從事軟件開發的企業來說,掌握一個比較完整和合理的基于安卓原生框架的消息推送系統的設計原理,意義之重大不言而喻.可以在這個實現的基礎之上,根據自身業務的需求,只要做與業務相關的部分,不再需要重復去設計底層功能.這樣就簡化了對設計的要求,同時,也對開發人員的能力要求方面有所降低.開發人員只是業務方面的行家,只要關注與自己業務相關的開發,努力把業務做到極致,把用戶體驗做到更加豐富多彩.對于底層、協議等這些比較晦澀、難懂的技術實現不需要關注.

1 XMPP協議

XMPP[1]:中文意思是擴展消息出席協議.設計的目的是使用相對較小的結構化數據(稱為“XML節”) 片段在網絡完成上任何兩個(或更多)實體之間的數據交換.典型的應用場景是分布式客戶機-服務器體系結構,一個客戶端需要連接到服務器才能與其他實體(或與其他某個服務器)交換XML節.

兩個實體之間交換信息大體需要經歷下面的過程.

(1)設置IP地址和需要連接到端口號,基于全域名解析;

(2)打開TCP(Transmission Control Protocol)連接;

(3)在TCP上打開XML流;

(4)協商TLS(Transport Layer Security)通道加密;

(5)使用SASL(Simple Authentication and Security Layer)機制驗證身份;

(6)綁定資源流;

(7)通過網絡與其他節點交換XML數據節;

(8)關閉 XML 流;

(9)關閉TCP 連接.

1.1 XMPP網絡架構

XMPP協議的網絡應用通常被實現成基于分布式的客戶端-服務器網絡架構模型,實體之間采用TCP連接,并且每個客戶端只能夠與特定的服務器連接,要想實現端對端的連接,則中間必須經過一個或多個服務器的轉發[2].所以,在基于XMPP 協議的通信鏈路中,根據扮演的角色來細分的話,整個通訊的結構可以劃分成四大組件.

服務器:主要的功能是用來接收、轉發或處理傳輸數據,不同的實體在服務器上都有一個唯一的標識,便于服務器來區分.服務器也扮演數據存儲和管理客戶端的功能,能夠根據業務的需要實現功能定制和擴展.

客戶端:信息傳遞的發起者,數據的傳遞必須通過服務器的轉發才能到達其他服務器、客戶端.每個客戶端必須有明確的唯一的標識符,同時客戶端必須完全支持TCP套接字(Socket),能夠理解XML信息流的數據類型和正確解析XML數據.

網關:主要的功能是連接異構系統,實現互相通信,目的是實現不同協議之間的轉換,起到一個協議信息轉換的作用.

網絡:是實現不同實體之間互聯互通的通訊連接和信息傳輸的物理載體.

支持XMPP協議網絡拓撲結構如圖1所示.

圖1 網絡拓撲結構

1.2 XMPP地址格式

XMPP地址格式和我們經常使用的電子郵件類似,使用全局唯一地址來標識XMPP的實體,利用域名系統在網絡上轉發和傳遞消息.XMPP協議規范中明確規定,所有實體都是可尋址的,不光是特別的客戶端和服務器,而且提供附加服務的服務器都能被其他客戶端和服務器訪問.XMPP服務器地址類似“網絡域名”形式,比如xm.mydomain.com,而注冊在該服務器上賬戶地址形式mars@xm.mydomain.com,服務器設備或資源形式是mars@ xm.mydomain.com / balcon.XMPP出身Jabber,所以其地址被稱為Jabber Id.所以,一個JID的信息是由實體名稱、路由服務器和資源三部分組成[3].

2 需求分析和概要設計

消息推送的主要功能是向安卓手機客戶端推送文本消息,底層的通訊協議使用XMPP協議,要實現這個功能,需要服務器端的支持.

服務器端需支持以下功能:

(1)能夠完成安卓客戶端的注冊、連接和登錄常用的功能.新的客戶端第一次連接到服務器時,服務器獲取客戶端的信息并把信息寫入后臺的數據庫.

(2)服務器一直監聽客戶端狀態的變化(離線或在線),一旦客戶端離線或在線,自動更新記錄在數據庫表中的客戶端的狀態,便于管理員隨時通過管理頁面查看當前在線用戶的詳細信息.

(3)服務端以管理員控制臺的方式提供輸入文本信息界面,輸入需要推送的信息之后,能夠把該條信息主動向安卓手機客戶端推送.推送形式目前分為向指定的用戶推送與向系統數據庫中所有用戶推送這兩種形式.

安卓客戶端需支持以下功能:

(1)App部署成功,打開消息推送功能,自動連接到指定的服務器完成新用戶注冊功能.注冊的信息寫入到手機中配置信息中,已經在服務器完成過注冊之后,直接使用保存的注冊信息登錄.

(2)客戶端提供心跳機制,定時向服務器發送連接來維護自己與與服務器的連接.

(3)安卓客戶端屬于移動設備,有可能使用WIFI接入,一旦離開WIFI的覆蓋區域,自動向服務器發送連接斷開的請求,當再次進入覆蓋區域,具有斷線重連的功能.

要實現上面定義的業務功能,需要從下面幾個方面來思考:

(1)一個安卓客戶端和服務器的通訊過程可以簡化為一對一模型,通訊的過程是建立連接、傳遞數據和關閉連接.只不過,要使用XMPP協議的兩個互相通訊的實體之間,傳遞的是XML數據流.Java語言提供的網絡API很容易實現基于Socket的通訊網絡.

(2)如果涉及到多個安卓客戶端,那么通訊模型變成了一對多,服務器就需要維護連接列表來存放和處理每一個客戶端數據.

(3)XML的消息流到達安卓客戶端,需要被解析并以文本的形式展示,服務端的數據何時到達具有不確定性,所以,需要使用偵聽機制來異步處理消息,Android提供的APIs已經能夠滿足這個功能.服務器如果向在線的安卓客戶端發送一條信息,只需要遍歷連接列表,使用Socket發送一段XML流即可.

通過上面的思考和分析,消息推送的底層通訊的本質是Java語言的Socket網絡通訊,通過Socket建立的管道流中傳輸的是XML數據,這些數據是按照XMPP協議規范構造的,服務器和安卓客戶端必須能夠理解這些XML數據.所以,消息推送需要設計的基礎類庫必須要能實現下面的要求.

(1)附加在Socket通訊之上的應用必須要提供對Socket通訊的封裝,提供性能優良的多客戶端連接處理.

(2)需要設計一系列的類來抽象服務器和安卓客戶端的連接、客戶端會話以及對連接的處理.

(3)需要設計XML數據流的解析器,提供對XML到應用層數據解析工作,同時,基于XMPP通訊所需要的格式化XML數據構造器,完成應用層數據到XML的解析.

(4)消息接收和處理的時機具有不確定性,需要設計一系列的監聽器來監聽連接狀態的變化,進而觸發一系列事件.

3 系統結構設計

消息推送暫時只支持向在線的安卓客戶端推送文本消息.服務端需要完成的工作分成二塊,第一塊是在某個端口上監聽安卓客戶端套接字連接,連接一旦建立,安卓客戶端需要使用長連接的方式主動和服務器保持連接,處理來自服務器的不同類型的消息.第二塊是作為Web應用服務器,在80端口監聽PC客戶端瀏覽器的HTTP頁面請求,管理員使用瀏覽器在遠程呼出管理界面,實現對安卓客戶端的管理和文本消息的推送.服務器能夠響應瀏覽器的URL請求,調用部署在服務器上與URL請求一一對應的服務組件來處理請求,最后生成響應,呈現處理結果給客戶端.

XMPP服務模塊可以實現成一個獨立的服務器,HTTP服務模塊也是一個獨立的應用服務器,兩個服務模塊局部數據是共享的.所以,系統結構設計可以用圖2來表示.

XMPP服務模塊設計重點在于,Android客戶端和服務端的數據傳輸過程細節仍需要一系列結構的設計,包括連接的管理、認證管理以及出席狀態的管理等等.XMPP服務模塊是可以獨立運行的服務,不依賴于HTTP服務,當服務啟動之后,會有一系列的實例對象被生成,常駐在服務器的內存中.一種最佳的實踐是使用容器來管理這些實例化的對象,Spring IOC在實例對象管理方法做的比較好,所以,XMPP服務模塊在設計的時候,考慮使用IOC容器.

服務端的HTTP服務是典型的B/S結構的Web應用,已經有很多的成熟的框架供使用,目前比較流行的是SSH方案.

圖2 推送系統結構設計

本文使用XMPP協議作為底層的通訊協議,對協議的內容、通訊規程和語法規則做了做深入的剖析,在此基礎之上,對Android消息推送進行了需求分析,然后對支持該協議的客戶端和服務端進行了概要設計和系統結構設計,有利于其他項目集成并實現消息推送功能.

猜你喜歡
服務端安卓通訊
《茶葉通訊》簡介
《茶葉通訊》簡介
通訊報道
iPhone不卡的秘密曝光:安卓也能享受
文物表情包
新時期《移動Web服務端開發》課程教學改革的研究
在Windows Server 2008上創建應用
一種基于安卓系統的手機側抓包分析方法
通訊簡史
安卓L未至安卓M來了!安卓首泄漏M系統
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合