改定履曆:
2011-08-19-------------------建立文字文件
2011-08-25--------------------增加XMPP官網連結
2011-09-02-------------------新增對GLOOX1.0API文檔Main Page頁翻譯
個人研究XMPP已經有大約一個星期的時間了,基本過程是先看了三天的RFC,包括RFC3290,RFC3291兩個主要協議,然後就是研究GLOOX1.0了。XMPP除了這兩個核心協議之外還有很多的XEP擴充協議。另外比較成熟的XMPP協議棧是GLOOX1.0版。前文已經貼出了RFC文檔,從這篇文章開始詳細介紹GLOOX,由於本人也是邊學邊記錄,有高手飄過時請不吝賜教。
先貼出一下XMPP一些相關資源:
XMPP官網
gloox官方網站---這裡可以瞭解gloox的官方資訊,開發文檔等
gloox1.0API文檔---個人將官方的API文檔整站下載下來打包,方便本地查看,強烈建議大家詳細看一下文檔的Main Page頁,以對整個gloox的設計有一個大的層面上的理解
RFC3920------XMPP核心協議
RFC3921------立即訊息和出席資訊
xmpp協議PPT----XMPP PPT文檔
先這些吧,以後隨時補充
---------------------------------------------------------------------------------------------------------------------
GLOOX協議棧是基於所謂“觀察者”設計模式設計的,如果你熟悉“觀察者”設計模式或者不熟悉但是在去深入瞭解GLOOX之前能去看一下“觀察者”模式會對學習GLOOX很有好處。其主要思想就是將觀察者“註冊”到“被觀察者”那裡,“被觀察者”有什麼風吹草動,觀察者都會知道,而進一步的處理就是在你的程式裡實現“觀察者”的若干虛函數。
環境搭建的話,本人用的是vs2008,下載下來gloox1.0,建立一個工程把gloox下src目錄裡所有的.h和.cpp全部載入,再添加一個工程用於對gloox進行測試,將兩個工程的組建目錄及依賴設定好即可。
----------------------------------------------------------------------------------------------------------------------
補充:博主近日學習GLOOX,重讀了API Main Page頁,覺得Main Page頁對於新手從較高層面上把握GLOOX有很大協助,且這裡往往是新手容易忽略的最直接的一手資料資訊來源,於是決定花時間翻譯出來。限於本人英文水平,大家可參照原英文文檔查看:
Introduction:
GLOOX的設計遵循了所謂的觀察者設計模式,含義是一切都是基於事件驅動的。使用GLOOX不如Jabber/XMPP網路有兩種方式------做為用戶端或組件。C++ XMPP伺服器庫請參考<http://camaya.net/glooxd>.
Note:
XMPP詳細規格說明書(RFC 3290)的11.5小節要求,線路上交換的資料只能是UTF-8編碼方式,由於GLOOX不知道輸入的資料是哪種編碼,所以GLOOX要求輸入資料必須是有效UTF-8編碼。
Event Handlers:
GLOOX裡最重要的工具就是事件處理器(event hanbdlers),當前,除了有為RFC中定義的基本協議服務的4種事件處理器,還有為XEP實現裡的事件和附加功能服務的其它許多事件處理器。另外,一個Tlog器、一個一般標籤處理器和一個串連事件處理器都是有效。
通常這些處理器都是虛介面,你可以繼承它們派生出一個類,並且實現一些這些虛函數。然後你可以註冊這樣的一個子類對象到各自的協議實現裡。下面是一個簡單的例子: [cpp] view plain copy class MyClass : public PresenceHandler { public: // reimplemented from PresenceHandler virtual void handlePresence(const Presence& presence ); [...] }; void MyClass::handlePresence( const Presence& presence ) { // extract further information from the Presence object }
在某個地方你可以像下面這樣做: [cpp] view plain copy OtherClass::doSomething() { Client* client = new Client( ... ); [...] MyClass* handler = new MyClass( ... ); client->registerPresenceHandler( handler ); } 然後你可以使用Stanza類提供的眾多getters(即get首碼的成員函數)進一步提取節中的資料
現在,每次接收到一個presence節(非subscription節)時,handlePresence都會被調用,參數是當前節。然後你可以使用Stanza類提供的眾多getters(一般來講是get首碼的方法,此處理解為擷取stanza各資料的方法)進一步提取節中的資料以進一步處理。
幾乎所以的事件處理器的工作方式都是與這個例子相似的,接下來以使用串連事件處理器(class ConnectionListener)為例,再舉一例: [cpp] view plain copy class MyClass : public ConnectionListener { public: virtual void onConnect(); virtual bool onTLSConnect( ... ); }; void MyClass::onConnect() { // do something when the connection is established } bool MyClass::onTLSConnect( const CertInfo& info ) { // decide whether you trust the certificate, examine the CertInfo structure return true; // if you trust it, otherwise return false }
Note:
ConnectionListener是一個比較奇特的介面。你必須重新實現ConnectionListener::onTLSConnect()這個介面,如果你想成功串連一個啟用了TLS/SSL伺服器的話。儘管GLOOX試圖檢查伺服器的認證,但不會自動的信任該伺服器。必須由用戶端程式員或使用者來決定是否信任此伺服器。是否信任就由onTLSConnect()的傳回值來表示,FLASE意味著你不信任該伺服器,結果就是與伺服器的串連中斷。
先去吃飯了,回來待續……
Components
Jabber/XMPP網路中的一個組件是載入到伺服器上的,它運行在實際的服務軟體之外,但它有相似的許可權,組件使用XEP-0114中描述的協議去串連和驗證一個伺服器.類Component 支援該協議並且可以用於建立一個新的Jabber component.簡單的例子如下:
[cpp] view plain