XMPP協議相關基礎概念


1. XMPP
eXtensible Messaging and Presence Protocol可擴展消息處理和現場協議,用於在2個地點之間傳遞小型的結構化數據段的協議。定義了在兩個或更多痛心屍體之間傳遞數據所採用的格式。
2. XMPP服務器
為XMPP節提供路由。
3.應用
在XMPP內部,可以找到由聯繫人組成的花名冊,可以用它們來創建定向或無向社交圖。
當聯繫人上下線時自動發送出席通知,而個人消息和公共消息時XMLPP系統的基礎應用。
有時候開發人選選擇XMPP作為底層技術。
4. XMPP內部功能塊
構建發布-訂閱服務、多人聊天、表單檢索和處理、實時數據傳輸、隱私控制、遠程過程調用。
5. XMPP節
XMPP通信的端點以節為單位來處理輸入和產生輸出。
首先有個XMPP流,然後所有工作都是在這個流上發送和接收XMPP節實現的。
XMPP流有2份XML文檔組成,通信的每個方向均有1份。這些文檔的根節點是<stream:stream>。這個stream節點的子節點由“可陸游的節以及流相關的頂級節點”構成。每個節都是一個XML元素(包括它的子節點)。
XMPP節有3種:<presence>、<message>、<iq>。

6.連接的lifecyle
連接

建立流

身份驗證:當一個連接首次建立時,Strophe會在後台發送並接受幾個XMPP節以處理身份驗證和會話建立工作。只有當會話成功啟動時才會獲得CONNECTED狀態。

斷開連接

7. BOSH
Web瀏覽器自身並不能理解XMPP協議(至少目前不會),因此XMPP連接必須通過HTTP請求建立隧道。這種隧道技術的一個副作用就是要把XMPP節放入到<body>包裝器中,該包裝器包含了一些有關請求的原數據。這種隧道技術(名為BOSH)正式文檔XEP-0124和XEP-0206的主題。show_traffic()函數忽略這個<body>包裝器而處理它的子元素,也就是XMPP節本身。
8.序列化
XML轉化為文本。Strophe.serialize()方法。
9. JID
即XMPP網絡上的每個屍體的1個或多個地址。每個JID有三部分組成:節點、域、資源。域是必須的,節點和資源是可選的,取決於具體環境。
域:實體(服務器、組件或插件)的可解析DNS名稱。

裸JID elizabeth@longboutn.lit (無資源部分)
完整JID elizabeth@longboutn.lit/library

10.獲取JID的方法(connection的jid屬性包含著與該連接相關的完整JID)
Strophe.getUserFromJid(“darcy@pemberley.lit/library”);//darcy
Strophe.getDomainFromJid(“darcy@pemberley.lit/ library”);//pemberley.lit
Strophe.getResourceFromJid(“darcy@pemberley.lit/library”);//library
Strophe.getBareJidFromJid(“darcy@pemberley.lit/library”);//darcy@pemberley.lit
11 .幾個日誌函數Strophe
Strophe中的每個連接都有一個特殊的函數來鉤入正在發送和接受的協議數據。
1) xmlInput() xmlOutput()用於格式化XMPP流的xml格式
2) rawInput() rawOutput()用於實際的字符數據
12. IQ
1)每個IQ-get或IQ-set節都必須接受到相應的IQ-result或IQ-error節(就像是HTTP協議任何GET或POST請求都必須接受到一個響應)。
2)所有<iq>節必須攜帶一個id屬性,用於在會話中唯一識別傳入的響應,即特定節的IQ-result或IQ-error所對應的IQ-get或IQ-set節。
3)必須為每次發送IQ-get或IQ-set節設置XMPP處理程序來處理成功或錯誤響應。
4)調用函數為Connection.sendIQ(iq_stanza, success_callback, error_callback);後面兩個參數是可選的。
13.打招呼
應用程序需要向服務器發送一個XMPP節向其打招呼,我們通過Strophe的構造器來完成這件工作。hello節十個一包含ping請求的IQ-get節。
14. addHandler
addHandler: function(handler, ns, name, type, id, from){
//實現方法
}
1)只有頂級節點會檢查後四個參數
2)ns用於檢查頂級節點以及它的直接子節點,通常只針對IQ節。IQ節通常包含一個子節點,這個自節點的namespace是根據它的服務類型確定的。
舉例:conn.addHandler(myHandler, “urn:xmpp:ping”, “iq”);//每當connection接受到一個位於urn:xmpp:ping命名空間下的子節點IQ節時,都會調用myHander()函數。
15. chat states(http://xmpp.org/extensions/xep-0085.html)

16. nginx轉發配製

如果是多台服務器的話,js存在跨域問題,所以得用代理來作轉發,我用的是nginx,也可以apache。
17.會話技術
BOSH連接管理器用於相應HTTP請求,並利用它們為用戶管理XMPP連接。除了XMPP通信所需的套接字外,每個託管連接均有2個與之相關的數據:SID和RID。
SID:會話標識符(Session Identifier).通常是一個較長的、無意義的、由字母和數字組成的字符串。
RID:請求標識符(Request Identifier).表示與BOSH託管連接相關聯的HTTP協議請求。在連接建立之前,客戶端在它的第一個請求中向連接管理器發送一個隨機的RID。每個後續的請求都會將這個RID的值遞增1。
這兩個標識符用於唯一定位和使用託管的XMPP會話,即,如果一個應用程序知道SID和RID,那麼它就能夠接管或接入底層的會話。我們需要做的就是使用未經修改的SID和遞增1之後的RID向BOSH連接管理器發送一個請求。
接入會話使用的函數:
var connection = new Strophe.Connection(BOSH_URL);
connection.attach(jid, sid, rid, callback);
18.持久化鏈接
實現會話的持久化就是吧SID和RID存儲到cookie中,並在加載下一個頁面時重新將其接入會話中。