1. 程式人生 > >【XMPP協議】開發Android即時通訊APP之瞭解XMPP(一)

【XMPP協議】開發Android即時通訊APP之瞭解XMPP(一)

目前正在忙公司專案,製作基於XMPP的即時通訊APP,為此必須先了解下XMPP協議,所以寫篇部落格加深下印象。
關於XMPP協議的相關介紹:
XMPP(Extensible Messageing and Presence Protocol:可擴充套件訊息與存在協議)是目前主流的四種IM(IM:instant messaging,即時訊息)協議之一,其他三種分別為:即時資訊和空間協議(IMPP)、空間和即時資訊協議(PRIM)、針對即時通訊和空間平衡擴充的程序開始協議SIP(SIMPLE)。
在這四種協議中,XMPP是最靈活的。XMPP是一種基於XML的協議,它繼承了在XML環境中靈活的發展性。因此,基於XMPP的應用具有超強的可擴充套件性。經過擴充套件以後的XMPP可以通過傳送擴充套件的資訊來處理使用者的需求,以及在XMPP的頂端建立如內容釋出系統和基於地址的服務等應用程 序。而且,XMPP包含了針對伺服器端的軟體協議,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程式或給一個配好系統新增功能。
XMPP的前身是Jabber,一個開源形式組織產生的網路即時通訊協議。XMPP目前被IETF國際標準組織完成了標準化工作。標準化的核心結果分為兩部分; 核心的XML流傳輸協議 基於XML流傳輸的即時通訊擴充套件應用 XMPP的核心XML流傳輸協議的定義使得XMPP能夠在一個比以往網路通訊協議更規範的平臺上。藉助於XML易於解析和閱讀的特性,使得XMPP的協議能夠非常漂亮。 XMPP的即時通訊擴充套件應用部分是根據IETF在這之前對即時通訊的一個抽象定義的,與其他業已得到廣泛使用的即時通訊協議,諸如AIM,QQ等有功能完整,完善等先進性。
XMPP中定義了三個角色,客戶端,伺服器,閘道器

。通訊能夠在這三者的任意兩個之間雙向發生。伺服器同時承擔了客戶端資訊記錄,連線管理和資訊的路由功能。閘道器承擔著與異構即時通訊系統的互聯互通,異構系統可以包括SMS(簡訊),MSN,ICQ等。基本的網路形式是單客戶端通過TCP/IP連線到單伺服器,然後在之上傳輸XML。
舉個例子看看所謂的XML流是什麼樣子的?

客戶端:<?xml version='1.0'?>
  <stream:stream
  to='example_com'
  xmlns='jabber:client'
  xmlns:stream='http_etherx_jabber_org/streams
'   version='1.0'>
  伺服器:<?xml version='1.0'?>   <stream:stream   from='example_com'   id='someid'   xmlns='jabber:client'   xmlns:stream='http_etherx_jabber_org/streams'   version='1.0'>   ...其他通訊...   客戶端:<message from='juliet_example_com'   to='romeo_example_net'   xml:lang='en'>
  客戶端: <body>Art thou not Romeo, and a Montague?</body>   客戶端:</message>   伺服器:<message from='romeo_example_net'   to='juliet_example_com'   xml:lang='en'>   伺服器:<body>Neither, fair saint, if either thee dislike.</body>   伺服器:</message>   客戶端:</stream:stream>   伺服器:</stream:stream>

XMPP通過TCP傳什麼了?
傳輸的是與即時通訊相關的指令。在以前這些命令要麼用2進位制的形式傳送(比如QQ),要麼用純文字指令加空格加引數加換行苻的方式傳送(比如MSN)。而 XMPP傳輸的即時通訊指令的邏輯與以往相仿,只是協議的形式變成了XML格式的純文字。這不但使得解析容易了,人也容易閱讀了,方便了開發和查錯。而 XMPP的核心部分就是一個在網路上分片斷髮送XML的流協議。這個流協議是XMPP的即時通訊指令的傳遞基礎,也是一個非常重要的可以被進一步利用的網路基礎協議。所以可以說,XMPP用TCP傳的是XML流。

XMPP的特點:

  1. 客戶端/伺服器通訊模式
  2. 分散式網路
  3. XML資料格式

同時XMPP也是存在不足的地方:

**資料負載太重:隨著通常超過70%的XMPP協議的伺服器的資料流量的存在和近60%的被重複轉發,XMPP協議目前擁有一個大型架空中存在的資料提供給多個收件人。新的議定書正在研究,以減輕這一問題。
沒有二進位制資料:XMPP協議的方式被編碼為一個單一的長的XML檔案,因此無法提供修改二進位制資料。因此,檔案傳輸協議一樣使用外部的HTTP。如果不可避免,XMPP協議還提供了帶編碼的檔案傳輸的所有資料使用的Base64。至於其他二進位制資料加密會話(encrypted conversations)或圖形圖示(graphic icons)以嵌入式使用相同的方法。**

伺服器端:
openFire
客戶端:
Smack

關於OpenFire
Openfire 採用Java開發,開源的實時協作(RTC)伺服器基於XMPP(Jabber)協議。您可以使用它輕易的構建高效率的即時通訊伺服器. Openfire安裝和使用都非常簡單,並利用Web進行管理。單臺伺服器可支援上萬併發使用者。由於是採用開放的XMPP協議,您可以使用各種支援XMPP協議的IM客戶端軟體登陸服務.

關於Smack
Smack是一個開源,易於使用的XMPP(jabber)客戶端類庫。Smack API, 是一個 Java 的XMPP Client Library,也是由Jive Software開發。 優點:程式設計簡單。 缺點:API並非為大量併發使用者設計,每個客戶要1個執行緒,佔用資源大,1臺機器只能模擬有限(數千個)客戶.smack是一個用 java 寫的XMPP客戶端程式碼庫, 是 spark 的核心.