即時通訊:XMPP基礎

即時通訊系列閱讀

  1. 即時通訊基礎
  2. 即時通訊:XMPP基礎
  3. 即時通訊:XMPP項目實踐-微聊
  4. Smack類庫最好的學習資料

1. XMPP 簡介

XMPP(Extensible Messaging and Presence Protocol)是一種基于標準通用標記語言的子集XML 的協議,它繼承了在XML 環境中靈活的發展性。因此,基于XMPP 的應用具有超強的可擴展性。經過擴展以后的XMPP 可以通過發送擴展的信息來處理用戶的需求,以及在XMPP 的頂端建立如內容發布系統和基于地址的服務等應用程序。

而且,XMPP 包含了針對服務器端的軟件協議,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程序或給一個配好系統添加功能。

XMPP(可擴展消息處理現場協議)是基于可擴展標記語言(XML)的協議,它用于即時消息(IM)以及在線現場探測。它在促進服務器之間的準即時操作。這個協議可能最終允許因特網用戶向因特網上的其他任何人發
送即時消息,即使其操作系統和瀏覽器不同。

XMPP 的前身是Jabber,一個開源形式組織產生的網絡即時通信協議。XMPP 目前被IETF 國際標準組織完成了標準化工作。標準化的核心結果分為兩部分;XMPP 其實就是用TCP 傳的是XML 文件流。

xmpp特點

  1. 開放:XMPP協議是自由、開放、公開的,并且易于了解。 而且在客戶端 、 服務器 、 組件 、 源碼庫等方面,都已經各自有多種實現。
  2. 標準:互聯網工程工作小組( IETF )已經將Jabber的核心XML流協議以XMPP之名,正式列為認可的實時通信及Presence技術。 而XMPP的技術規格已被定義在RFC?3920及RFC?3921 。 任何IM供應商在遵循XMPP協議下,都可與Google Talk實現連接。
  3. 證實可用:第一個Jabber(現在XMPP)技術是Jeremie Miller在1998年開發的,現在已經相??當穩定;數以百計的開發者為XMPP技術而努力。 今日的互聯網上有數以萬計的XMPP服務器運作著,并有數以百萬計的人們使用XMPP實時傳訊軟件。
  4. 分散式:XMPP網絡的架構和電子郵件十分相像;XMPP核心協議通信方式是先創建一個stream,XMPP以TCP傳遞XML數據流,沒有中央主服務器。 任何人都可以運行自己的XMPP服務器,使個人及組織能夠掌控他們的實時傳訊體驗。
  5. 安全:任何XMPP協議的服務器可以獨立于公眾XMPP網絡(例如在企業內部網絡中),而使用SASL及TLS等技術的可靠安全性,已自帶于核心XMPP技術規格中。
  6. 可擴展:XML 命名空間的威力可使任何人在核心協議的基礎上建造定制化的功能;為了維持通透性,常見的擴展由XMPP標準基金會 。 彈性佳 XMPP除了可用在實時通信的應用程序,還能用在網絡管理、內容供稿、協同工具、文件共享、游戲、遠程系統監控等。
  7. 多樣性:用XMPP協議來建造及布署實時應用程序及服務的公司及開放源代碼計劃分布在各種領域;用XMPP技術開發軟件,資源及支持的來源是多樣的,使得使你不會陷于被“綁架”的困境。

下面給大家介紹XMPP 通信中最核心的三個XML 節(stanza)。這些節(stanza)有自己的作用和目標,通過組織不同的節(stanza),就能達到我們各種各樣的通信目的。

<stream:stream>
    <iq
        id="roster1"
        type='get'>

        <query xmlns='jabber:iq:roster'/>
    </iq>

    <message
        from='test_account@jabber.org'
        to='william_duan@jabber.org'
        type='chat'>

        <body>Hello</body>
    </message>

    <presence type='unavailable'/>
</stream:stream>

在上面的xml 中,我們可以看到一些XMPP 節(stanza),包括<iq>,<message>以及<presence>。接下來就對這些節(stanza)做一個大致的了解。

1.1節的共通屬性

1.1.1 from

表示節(stanza)的發送方,在發送節(stanza)時,一般來說不推薦設定,服務器會自動設定正確的值,如果設定了不正確的值,服務器將會拒收該節(stanza)信息。如果在客戶端到服務器端的通信中接收的節(stanza)中沒有該屬性,會被默認解釋為信息是由服務器發出的。如果在服務器到服務器的通信中接收的節(stanza)中沒有本屬性,則會被解釋為一個error。

1.1.2 to

表示節(stanza)的接收方。如果在客戶端到服務器端的通信中沒有設置本屬性,服務器會默認解釋為信息是發給自己的。

1.1.3 type

指定節(stanza)的類型.每種節(stanza)都會有幾種可能的設定值。所有的節(stanza)都會有一個error 類型,表明這個節(stanza)是一個error 回應,對這樣的節(stanza)信息不需要進行回應。

1.1.4 id

表示一個特定的請求。在<iq>節中,這個屬性是必須要指定的,但是在其他兩個節(stanza)中是一個可選屬性。

1.2 iq 節點

iq 節(stanza)主要是用于Info/Query 模式的消息請求,他和Http 協議比較相似。可以發出get 以及set 請求,就如同http 中的GET 以及POST。iq 節點需要有回應,有get,set 兩種請求以及result,error 兩種回應。發送查詢消息示例:

<iq from="william_duan@jabber.org/study" type="get" id="roster1">
    <query xmlns="jabber:iq:roster"/>
</iq>

上面xml 的意思是william_duan 查詢自己的聯系人列表。

接收到回應示例:如果請求錯誤:

<iq to="william_duan@jabber.org/study" type="error" id="roster1">
    <query xmlns="jabber:iq:roster"/>
    <error type="cancel">
        <feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
    </error>
</iq>

如果請求成功:

<iq to="william_duan@jabber.org/study" type="result" id="roster1">
    <query xmlns="jabber:iq:roster"/>
    <item jid="account_one@jabber.org" name="one"/>
    <item jid="account_two@jabber.org" name="two"/>
</iq>

william 獲取到了自己的花名冊列表,該列表中有兩個好友。

1.3 message 節點

正如名字一樣,message 節(stanza)用于用戶之間傳遞消息。這消息可以是單純的聊天信息,也可以某種格式化的信息。message 節點信息是傳遞之后就被忘記的。當消息被送出之后,發送者是不管這個消息是否已經送出或者什么時候被接收到。通過擴展協議,可以改變這樣一種狀況。

私人會話示例:

<message from="william_duan@jabber.org" to="test_account@jabber.org" type="chat">
    <body>Come on</body>
    <thread>23sdfewtr234weasdf</thread>
</message>

群組會話示例:

<message from="test_account@jabber.org" to="william_duan@jabber.org" type="groupchat">
    <body>welcome</body>
</message>

1.4 presence 節點

presence 節(stanza)用來控制和表示實體的在線狀態,可以展示從離線到在線甚至于離開,不能打擾等復雜狀態,另外,還能被用來建立和結束在線狀態的訂閱。

在線狀態示例:

//設定用戶狀態為在線
<presence/>
..............................
//設定用戶狀態為離線
<presence type="unavailable"/>
..............................
//用于顯示用戶狀態的詳細信息。上面的例子表明用戶因為at the ball 在離開狀態。
<presence>
    <show>away</show>
    <status>at the ball</status>
</presence>

<show>標簽在presence 節點中最多出現一次,可以有以下取值:away,chat,dnd,xa。

  • away:離線
  • chat:交談中
  • dnd:希望不被打擾
  • xa:離開一段時間

<status>標簽用于顯示額外信息。

在線狀態預定(presence subscription) :

<presence
    from="william_duan@jabber.org"
    to="test_account@jabber.org"
    type="subscribe"/>

..............................
<presence
    from="test_account@jabber.org"
    to="william_duan@jabber.org"
    type="subscribed"/>

通過上述交互,william_duan 就能看到test_account 的在線狀態,并能接收到test_account 的在線狀態通知了。

2. XMPP 服務器平臺

我們在學習JavaWEB 的時候要用到web 服務器,那么我們就選擇了Tomcat 作為web 服務器。同樣的道理我們要學習即時通信,這整個體系是一個C/S 架構,Server 端不需要我們編寫,那么我們就選擇一款市場上免費開源的服務,除了Openfire 暫無他選,Openfire 是開源免費功能強大的IM 服務器。為什么選擇Openfire 呢?請往下看。

Openfire 采用Java 開發,開源的實時協作(RTC)服務器基于XMPP(Jabber)協議。Openfire 安裝和使用都非常簡單,并利用Web 進行管理。單臺服務器可支持上萬并發用戶。您可以使用它輕易的構建高效率的即時通信服務器。由于是采用開放的XMPP 協議,您可以使用各種支持XMPP 協議的IM 客戶端軟件登陸服務。

2.1 案例-Openfire 的下載和安裝

下載地址:http://www.igniterealtime.org/downloads/index.jsp

我們下載windows 平臺的openfire_3_10_2.exe 文件。

雙擊開始安裝。

選擇中文(簡體),然后點擊確定。


選擇我接受協議,然后點擊下一步。

選擇好安裝路徑,然后點擊下一步。

耐心等待,大概50 秒。

點擊完成。

啟動之后彈出如上界面,有異常!大概應該是日志相關的文件找不到。我們先不管,點擊Launch Admin 啟動
管理控制臺。

我們注意上圖中的地址欄,端口是9090,這是openfire 使用的端口,我們有時候喜歡把tomact 配置層9090,一定注意不要占用了該端口。
我們選擇中文(簡體),然后點擊continue。

設置域,其他設置默認即可。然后點擊繼續(上一頁還是continue,選中過中文后可就成繼續了)。

注意:這個時候必須先確保本機已經安裝了MySQL,并創建了數據庫,我創建的數據庫名字就叫做openfire。
然后在該數據庫中執行sql 腳本,該sql 腳本是openfire 提供的,位置位于:

在數據庫中將該腳本內容執行一下,讓其初始化數據表結構。
然后點擊繼續,進入下一個頁面。

使用默認配置,繼續點擊繼續。進入下一個頁面。

在上面填寫郵箱和管理員密碼,然后點擊繼續。

成功啦!點擊登錄到控制臺,進入如下界面。

openfire 管理員默認賬號為admin,密碼就是我們上一個界面設置的密碼。輸入賬號和密碼,然后點擊登錄。
進入下一個界面。

我們就來瀏覽一下成功后的界面吧

用戶列表界面:

會話界面:

分組聊天界面:

3. XMPP 客戶端平臺

3.1 Spark 客戶端的下載和安裝

Spark 是一個開源,跨平臺IM 客戶端。它的特性支持集組聊天,電話集成和強大安全性能。如果企業內部部署IM 使用Openfire+Spark 是最佳的組合。其官網對Spark 的介紹如下:

Spark is an Open Source, cross-platform IM client optimized for businesses and organizations. It features built-in support for group chat, telephony integration, and strong security. It also offers a great end-user experience with features like in-line spell checking, group chat room bookmarks, and tabbed conversations。

Combined with the Openfire server, Spark is the easiest and best alternative to using un-secure public IM networks。

Spark 的下載地址

下載好以后:

雙擊安裝。安裝非常簡單,一路點擊下一步即可。

點擊Next,進入下一個界面:

點擊Next......Next 進入下一個界面:

看到如下界面就OK 了,如果在上一個界面點擊Finish 沒有起效,那么可以找到生成的桌面快捷圖標,雙擊。

點擊賬號,進入下一個界面。

在上圖中輸入用戶、密碼和服務器地址。

然后創建賬號。

在上圖中點擊確定,進入如下圖界面。

點擊Login 進入如下界面:

Paste_Image.png

在openfire 中刷新界面,打開用戶/組選項卡,可以看到所有注冊的用戶列表。

Paste_Image.png

3.2 Spark 和Openfire 通信原理

從網上找到一個Spark 和Openfire 直接通訊架構圖。看懂這張圖就知道他們之間是如何通信的了。

Paste_Image.png

Smack 是對XMPP 協議的封裝庫,Smack 是XMPP 協議的Java 層的封裝。讓我們Java 程序員不用直接跟枯燥無味的XML 打交道(生成XML 和解析XML)。

隨著移動互聯網的快速發展,尤其是即時通信的發展,幾乎90%以上的App 都有這樣的功能。因此asmack也與13 年誕生,asmack 其實就是Android Smack 的簡稱。asmack 也是我們該門課程用到的主要API。

下面請看第5 章吧,讓我們一起學習如何使用asmack 打造我們的交友神器。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容