Android即時通信開發之XMPP (一)初識XMPP協議和asmack

在講XMPP和asmck以前 ,我仍是先分享一些資源文檔,若是你有耐心,能夠直接忽略我下面所寫的。下面有關XMPP的介紹大部分是摘抄網上的文檔,後面我會寫一些基於XMPP協議和asmck開源庫的聊天室開發,功能包括,文本,語音,和當前地理位置地址。html

XMPP官網http://xmpp.orgjava

Smack開發官方指導文檔http://www.igniterealtime.org/builds/smack/dailybuilds/documentation/extensions/index.htmlnode

Smack開發API文檔http://www.igniterealtime.org/builds/smack/dailybuilds/javadoc/android

XMPP中文翻譯計劃http://wiki.jabbercn.org/首頁git

 

一,什麼是XMPPgithub

       XMPP(Extensible Messaging and Presence Protocol),可擴展消息與存儲協議,是目前主流的IM協議之一,它是一種基於XML傳輸的協議,咱們都知道XML的可擴展性比較強,XMPP使用XML進行傳輸,使得咱們可使用XMPP發送擴展的消息來知足咱們更多的需求。安全

       XMPP包含兩部分的定義:一是核心的XML流傳輸協議,此定義使得XMPP可以在一個比以往網絡通訊協議更規範的平臺上實現;二是基於
XML流傳輸的即時通信擴展應用。服務器

       XMPP 中定義了三個角色:客戶端,服務器,網關。通訊可以在這三者的任意兩個之間雙向發生。服務器同時承擔了客戶端信息記錄,鏈接管理和信息的路由功能。網關承擔 着與異構即時通訊系統的互聯互通,異構系統能夠包括 SMS(短信),MSN,ICQ 等。基本的網絡形式是單客戶端經過 TCP/IP 鏈接到單服務器,而後在之上傳輸 XML。 網絡

XMPP 的基本網絡結構以下:dom

C1----S1---S2---C3

          |
C2----+--G1===FN1===FC1


符號表示:C1,C2,C3=XMPP 客戶端;S1,S2=XMPP;服務端 G1=在 XMPP 和使用外部消息網絡(非 XMPP)的協議之 間轉換的網;FN1=外部消息網絡;FC1=外部消息網絡的客戶端。 

 

(1)服務器

      服務系統是 XMPP 通訊的智能提取層,它主要負責:管理來自其餘個體的會話鏈接或者 XML 流(streams)和來自客戶 端、服務器、其餘個體的認證發送在 XML 流實體之中的適當的 XML 地址節點。大多數 XMPP 服務都容許存儲一些客戶端 數據(好比聯繫人列表),在這種狀況下,服務直接面向這個客戶端處理 XML 數據,而不是其餘個體。


(2)客戶端

      大多數客戶端是經過 TCP 直接鏈接,而且使用 XMPP 得到服務器提供所有-12-第 2 章 Jabber 協議原理及其應用功能和其 他服務。許多資源經過認證的客戶端也許同時鏈接到服務器,定義在 XMPP 地址的每一個資源是不一樣的(好比 <node@domain/home>和<node@domain/work>)建議服務器和客戶端採用的端中是 5222。

(3)網關

      它的主要功能是將 XMPP 協議轉換成外部消息(non-XMPP)系統使用的協議,也將返回的數據轉換成 XMPP。這些通訊是基 於網關和服務器,基於網關和外部消息系統之間的。 

XMPP 消息格式

      Jabber/XMPP 系統使用 XML 流在不一樣實體之間相互傳輸數據。在兩個實體的鏈接期間,XML 流將從一個實體傳送到另外一個實體。在實體間,有三個頂層的 XML 元素:

    <message/>,<presence/>和<iq/>。每個都包含屬性和子節 點。下面將分別描述這些元素。

   1.消息(message)元素:

        一個即時消息系統最基本的功能就是可以在兩個用戶之間實時交換消息,<message/>元素就提供了這個功能。每條消息 都有一個或多個屬性和子元素。屬性「from」和「to」分別表示了消息發送者和接收者的地址。<message/>也能夠包含 一個「type」屬性,這給接收者一個提示,這個消息是什麼樣的消息。表 3-1 給出了「type」屬性的可能取 值。<message/>中也能夠包含「id」屬性,用來惟一的標識一個輸出消息的響應。

   2. 狀態(presence)元素:

        <presence/>元素用來傳遞一個用戶的存在狀態的感知信息。用戶能夠是「available」,要麼 是「unavailable」,「Hide」等。當用戶鏈接到即時消息服務器後,好友發給他的消息就當即被傳遞。若是用戶沒有連 接到服務器,好友發給他的消息將被服務器存儲起來直到用戶鏈接到服務器。用戶經過即時消息客戶端本身控制可用性。 可是,若是用戶斷開了同服務器的鏈接,服務器將發送給訂閱了這個用戶的存在信息的用戶通知他們用戶已經不可 用。<presence/>還包含了兩個子元素:<show/>和<status/>。<status>包含了一個對<show/>的文本描述。

   3. IQ(Info<Query)元素
        IQ 元素是 Jabber/XMPP 消息協議的第三個頂層元素。IQ 表明"Info/Query",用來發送和獲取實體之間的信息。IQ 消息 是經過「請求/響應」機制在實體間進行交換的。IQ 元素用於不一樣的目的,它們之間經過不一樣的命名空間來加以區分。在 Jabber/XMPP 消息協議裏有許多的命名空間,但最經常使用的命名空間 是:"jabber:iq:register","jabber:iq:auth","jabber:iq:roster"。

       上面描述了 Jabber 協議的三個頂層節點。經過這種格式 Jabber 消息不只能夠是簡單的文本(text),並且能夠攜帶 複雜的數據和各類格式的文件,也就是說 Jabber 不只能夠用在人與人之間的交流,並且能夠實現軟件與軟件或軟件與人 之間的交流。Jabber 的這種功能大大擴展了即時通訊的應用範圍。
XMPP 工做機制

 

 

例如:一個終端名字是 Remeo,經過服務器 montague.lit 與其餘的用戶相連,其餘的用戶 經過服務器 juliet@capulet.lit 創建鏈接。

第一步 Romeo 開始經過發送一個 stream 包與服務器 montague.lit 取得聯繫,這一步包含了鑑權,登陸等等。

 

第二步 Romeo 獲取了他的聯繫人列表,經過向服務器 montague.lit 發送<iq/>字段請求,按照下面的協議。

<iq type=‘get’from=‘romeo@montague.lit/pda’>
<query xmlns=‘jabber:iq:roster’/>

</iq>


<iq type=‘result’to=‘romeo@montague.lit/pda’>
<query xmlns=‘jabber:iq:roster’>
<item jid=‘juliet@capulet.lit’/><item jid=‘mercutio@shakespeare.lit’/>
<item jid=‘benvolio@shakespeare.lit’/>
</query>
</iq>

 

第三步 Romeo 發送了一個 presence 請求到服務器 montague.lit,而後會將這個信息廣播到他的全部好友。

<presence from=‘romeo@montague.lit/pda’/>
<presence from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’/>
<presence from=‘romeo@montague.lit/pda’to=‘mercutio@shakespeare.lit’
/>
<presence from=‘romeo@montague.lit/pda’to=‘benvolio@shakespeare.lit’
/>

 


第四步 若是 Romeo 的聯繫人都在線,就會將 presence 回覆給 Romeo,告知本身的狀態。
<presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/balcony’/>
<presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/chamber’/>
<presence to=‘romeo@montague.lit/pda’from=‘mercutio@shakespeare.lit/home’/>

第五步 Romeo 和 Juliet 開始交換信息,進行聊天。
<message from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’>
<body>hi!</body>
</message>
<message from=‘juliet@capulet.lit/balcony’to=‘romeo@montague.lit/pda’
>
<body>hi yourself!</body>
</message>

         以文檔的觀點來看,客戶端或服務器發送的全部 XML 文本連綴在一塊兒,從<stream>到</stream>構成了一個完整 的 XML 文檔。其中的 stream 標籤就是所謂的 XML Stream。在<stream>與</stream>中間的那些 <message>...</message>這樣的 XML 元素就是所謂的 XML Stanza(XML 節)。XMPP 核心協議通訊的基本模式就是 先創建一個 stream,而後協商一堆安全之類的東西,中間通訊過程就是客戶端發送 XML Stanza,一個接一個的。服務器 根據客戶端發送的信息以及程序的邏輯,發送 XML Stanza 給客戶端。可是這個過程並非一問一答的,任什麼時候候都有可 能從一個方發信給另一方。通訊的最後階段是</stream>關閉流,關閉 TCP/IP 鏈接。 

 

二,什麼是asmack

     asmack實際上是Smack在Android平臺上的一個實現版本,Smack 是一個實現了XMPP協議的開源API庫,

asmack github源碼地址:https://github.com/Flowdalic/asmack

因爲公司項目須要,我在asmack官方版本的基礎上,修改了部分源碼,使得其能夠很快速的投入項目使用。

修改後的源碼地址:https://github.com/UFreedom/asmack-android-8-source-4.0.2

這個源碼能夠直接下載,而後導入項目中使用

相關文章
相關標籤/搜索