XMPP協議相關基礎概念(Strophe學習筆記)

 相關資料:html

XMPP官網http://xmpp.org/xmpp-software/libraries/
nginx的轉發配置http://mineral.iteye.com/blog/448260
XMPP的xml格式http://seong.iteye.com/blog/1871338
IBM關於XMPP的講解https://www.ibm.com/developerworks/cn/xml/tutorials/x-realtimeXMPPtut/

 

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狀態。
  ↓
  斷開鏈接nginx

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名稱。apache

  裸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中,並在加載下一個頁面時從新將其接入會話中。cookie

相關文章
相關標籤/搜索