即时聊天IM之一 XMPP协议简述
Q? Q:408365330???? E-Mail:egojit@qq.com
?綜述:
之前小規模的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)建立的。
3.狀態(Presence)在整個聊天鏈接中都是維持存在的,XMPP協議有在網絡中維持存在和可用信息的能力。
4.XMPP允許建立并行的TCP套接字連接對所有連接上的客戶端和服務器端。一旦建立連接,會一直維持。因為鏈接一直保持著,那么 設置、用戶認證、用戶登錄狀態查找功能都不用每次都重復執行。
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枚舉值如下:
- available: 表示處于在線狀態
- unavailable: 表示處于離線狀態
- subscribe: 表示發出添加好友的申請
- subscribed:表示好友請求確認
- unsubscribe: 表示發出刪除好友的申請
- unsubscribed: 表示拒絕添加對方為好友
- error: 表示presence信息報中包含了一個錯誤消息。
?
三>消息/查詢元素<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?節。通過這種查詢/反饋結果的方式客戶端和服務器通信
?
轉載于:https://www.cnblogs.com/egojit/p/4874318.html
總結
以上是生活随笔為你收集整理的即时聊天IM之一 XMPP协议简述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android笔记:Activity
- 下一篇: iOS开发UI篇—使用嵌套模型完成的一个