綜述:程序員
以前小規模的IM一直經過百度雲推實現模擬IM,這種侷限性比較多。公司不少的項目都須要IM集成,因此最終想一想仍是本身搭建XMPP服務器來實現IM功能。這樣可控性比較強。能夠實現各類需求,首先就有必要學習XMPP協議。瞭解XMPP基礎協議的狀況下才能更好的使用smack庫,已經自定義各類擴展。安全
XMPP簡介:服務器
XMPP協議(Extensible Messaging and PresenceProtocol,可擴展消息處理現場協議) 它是一種基於XML基礎上實現的一種協議,是聊天通信的一個標準協議。Jabber最先實現XMPP協議的。首先咱們知道XML格式擴展性比較強,並且它又具備HTML這種穿透防火牆的功能,因此不易被防火牆攔截,所以在此基礎上的XMPP協議固然也具備這些特性,另外XML是和平臺無關的,實現多平臺數據交換沒有任何問題,XMPP確定也是如此。網絡
XMPP協議特色:架構
1.XMPP協議系統是一個分佈式的系統,每臺服務器能夠控制本身的系統資源,另外一方面它也能夠實現系統間資源交換。XMPP服務器利用開放的XML協議來進行S2S(Serverto Server)通訊,就像在C2S(Client to Server)同樣。相比之下,大多數的IM系統使用了只是支持C2S/S2C通訊的協議,所以Jabber/XMPP服務器具備更大的靈活性。分佈式
2.XMPP協議是公開的非私密的,不少程序是開放源代碼。XMPP協議客戶端和服務器端的交互要經由XML流。普通的聊天消息類型(message),改變用戶登陸狀態(presence),傳遞消息內容或查詢/更新(info/quey)應用是經過命名XML的命名空間(namespace)創建的。ide
3.狀態(Presence)在整個聊天連接中都是維持存在的,XMPP協議有在網絡中維持存在和可用信息的能力。模塊化
4.XMPP容許創建並行的TCP套接字鏈接對全部鏈接上的客戶端和服務器端。一旦創建鏈接,會一直維持。由於連接一直保持着,那麼 設置、用戶認證、用戶登陸狀態查找功能都不用每次都重複執行。post
5.Jabber/XMPP系統是模塊化的,Jabber/XMPP的設計注重如何實現可伸縮性、安全性以及擴展性。學習
XMPP協議的解析:
在XMPP協議中一直存在着三個關鍵點和角色,服務端,網關以及客戶端(手機,pc,平板……),咱們這裏所講的架構都是服務端/客戶端模式,而非客戶端直連
1.消息解析:
Jabber/XMPP系統經過XML流傳輸數據,XML從客戶端到服務端或者XML流從服務端到客戶端。這種XML流有三個頂層XML標籤元素:<message/>,<presence/>和<iq/>,固然每一個標籤都包含子標籤元素和屬性,下面將描述這些元素:
一>.消息標籤元素<message/>:
IM最基本的功能就是用戶之間進行聊天消息發送,這個元素就是承擔着這種功能。每一個message都有多個屬性"from"屬性和"to"屬性就是其中兩個,顧名思義就是信息誰發的,又是發給誰,也就是發送人地址和接收人地址。消息還有"type"屬性,標誌消息類型,這些都有固定的類型,固然消息也有固定的身份id屬性,這個id標誌每一天消息,這是惟一區分消息的。
二>用戶狀態元素<presence/>:
用戶登陸後能夠是:在線的available,隱身的Hide,又或者是離線的unavailable。用戶登陸上線後服務器會把消息發送給用戶,若是用戶不在線,那麼服務器會把消息存儲起來,這樣能夠實現離線消息。<presence/>元素包含<show/>和<status/>兩個元素,<show/>子元素是描述<status>的.
Presence主要有兩個用途: 1)告訴服務器全部客戶端當前所處的狀態,2)發出添加/刪除好友請求.
Presence.Type枚舉值以下:
三>消息/查詢元素<iq/>
Jabber/XMPP協議的最後一個訂層元素就是<iq/>元素。Info/Query的縮寫就是iq 顧名思義就是信息/查詢,經過這個元素能夠獲取各個端之間的消息,它是請求響應的也就是查詢反饋模式。每一個iq的目的都是不一樣的,它們經過命名空間namespace來區分。iq也有"from" "type" "id" 三個屬性,type屬性和http協議差很少有get 和post值.每個IQ-get 或IQ-set 節均必須接收響應的IQ-result 或IQ-error 節。經過這種查詢/反饋結果的方式客戶端和服務器通訊