gloox連線至伺服器端

2021-06-05 02:14:47 字數 3828 閱讀 8193

(原文出自:

在使用gloox之前,有必要先提一下xmpp協議這個東東。

xmpp協議是乙個基於網際網路的即時通訊標準協議。它採用xml技術,以文字的方式傳輸即時訊息。支援動態自定義擴充套件應用。與傳統的網路協議相比,如qq等,xmpp協議並不是乙個基於二進位制方式實現的協議,而是基於xml技術的文字方式,也就是說如果不採用加密技術的話,是可以直接檢視傳送的訊息的。xmpp協議通過定義一些xml的節點關鍵字,來表明訊息傳送資訊,並與其它協議能夠有效的結合,總的說來,xmpp協議是一種很不錯的準實時訊息協議標準。如果允許,你可以自己定義乙個協議出來,只要約定了xml節點關鍵字,並考慮了訊息交換中的各種情況。但是如果沒有特別的情況,一般應該是採用xmpp協議標準進行訊息交換,同時可以根據自己的特定應用,適當擴充套件一些節點,並根據自行擴充套件約定,解析之即可。

那麼gloox是用來幹嘛的呢?問題很簡單,根據前面所述,xmpp協議只是乙個協議,乙個約定,但本身並沒有提供實現方式。也就是說,xmpp協議定義的那些關鍵字以及傳送訊息等這些是需要實現的,只要按照xmpp協議來做的話,就可以互通訊息了。而gloox就是實現了這樣乙個協議的開發包,我們可以通過這個開發包,開發自己的應用來。

那麼gloox如何實現了xmpp協議的呢,其實它的底層就是乙個socket在收發資料,然後將資料進行xml的解析,封裝就可以了。如果允許的話,你是可以自己做socket通訊的,只要連線到xmpp伺服器,然後收發訊息就可以了,對收到的訊息,將其解析成xml格式,然後再獲取需要的資訊,對於發訊息,也是將要傳送的文字訊息封裝成xmpp協議定義的關鍵節點,然後利用socket傳送就可以了。

當然,如果通過socket通訊方式,按xmpp協議要求收發訊息是沒有任何問題的,可是說實話,真正能把握socket通訊是有一定難度的,雖然看起來就那麼幾個api,要想用好需要時間。而gloox已經做了這一步了,何必要重**明輪子呢?gloox已經在底層實現了和xmpp伺服器的socket通訊了,並且提供了二次開發介面,使我們不用考慮底層資料連線等方面的問題,何樂而不為呢?

好了,前面似乎說了些廢話,但對於一些東西的本質我認為是有必要清晰的認識一下的,這樣我們可以通過本質看現象,呵呵,反過來用也可以。明白了這一點,在使用gloox的api進行二次開發時,就能知其然,也知其所以然了。

這次先從基本的和xmpp協議伺服器連線開始,一步一步來。

我使用的伺服器是openfire,故我直接通過openfire的管理端在裡面建了幾個使用者,當然gloox提供了向伺服器註冊帳號,修改密碼以及刪除帳號的api,不過我這裡暫時不去做這個功能,因為我覺得在實際的專案開發中意義不大,並且如果能將其它的功能理解了,看一下gloox原始碼中的那個註冊的例子,應該是沒有任何問題的。

現在假設我已經註冊了乙個使用者名為:usertest@servertest/test,密碼為:testpassword的帳號,後面我將用這個帳號進行和伺服器的連線,即登陸。

假設現在你有乙個類叫messagetest,該類中有乙個方法叫start(),你打算用這個方法進行登陸,則登陸的**如下(**中含有解釋):

#include "include/client.h"

#include "include/connectionlistener.h"

#include "include/disco.h"

#include "include/stanza.h"

#include "include/gloox.h"

#include "include/lastactivity.h"

#include "include/connectiontcpclient.h"

using namespace gloox;

#ifndef _win32

# include

#endif

#include

#include

#if defined( win32 ) || defined( _win32 )

# include

#endif

//connectionlistener為乙個連線狀態資訊的//***,當連線成功,或者失敗時,都

//會呼叫該***中的該方法。如果你對連線狀態資訊不感興趣,可以不用繼承該

//類,認為連線肯定是成功的。但一般的使用是,需要繼承該介面,並實現其中的三個

//虛函式。

class messagetest : public connectionlistener

public:

messagetest()  {}

virtual ~messagetest() {}

void start()

//初始化乙個jid,即使用者id

jid jid( "usertest@servertest/test" ); 

//建立乙個連線客戶端,後乙個引數為密碼

j = new client( jid, "testpassword" );

//註冊連線狀態***,當呼叫該方法後,

//gloox會在後台自動呼叫該介面實現中的相應方法。

j->registerconnectionlistener( this );       //因為this中實現了connectionlistener介面

//設定服務,具體意思不詳,照這樣寫就可以了(與服務發現有關)

j->disco()->setversion( "messagetest", gloox_version, "linux" );              

j->disco()->setidentity( "client", "bot" );

//關於數字證書認證方面的東東,照抄就行了。

stringlist ca;

ca.push_back( "/path/to/cacert.crt" );

j->setcacerts( ca );

//呼叫j->connect(false)時,即實現與伺服器的連線,即登陸了,連線成功會返回//為真。connect函式引數為false表示不阻塞方式連線,而如果為真,則為阻塞//方式連線

if( j->connect( false ) )

//該該方法即為實現connectionlistener***介面中的連線成功的方法實現。

virtual void onconnect()

printf( "連線伺服器成功!!!/n" );

//該該方法即為實現connectionlistener***介面中的連線失敗或者

//斷開網路的方法實現。

virtual void ondisconnect( connectionerror e )

printf( "斷開連線: %d/n", e );

delete( j );        

///該該方法即為實現connectionlistener***介面中的安全連線成功的方法實現。

virtual bool ontlsconnect( const certinfo& info )

return true;

private:

client *j;//客戶端例項物件   

int main( int /*argc*/, char** /*argv*/ )//測試**

messagetest *r = new messagetest();

r->start();

delete( r );

return 0;

在連線伺服器中,只要你建立了乙個client物件例項,你就可以通過該例項操作了。其實獲得乙個與伺服器的連線,就是獲得乙個client例項物件,只要獲得這個例項物件,就擁有了和伺服器的連線(前提是呼叫了client物件中的connect()該方法)。

presence pre = client->presence();//client為建立的那個客戶端物件

client ->setpresence(pre);

gloox連線至伺服器端

原文出自 http blog.csdn.net qiuhong101 在使用gloox之前,有必要先提一下xmpp協議這個東東。xmpp協議是乙個基於網際網路的即時通訊標準協議。它採用xml技術,以文字的方式傳輸即時訊息。支援動態自定義擴充套件應用。與傳統的網路協議相比,如qq等,xmpp協議並不是...

gloox連線至伺服器端

在使用 gloox 之前,有必要先提一下 xmpp 協議這個東東。xmpp 協議是乙個基於網際網路的即時通訊標準協議。它採用 xml技術,以文字的方式傳輸即時訊息。支援動態自定義擴充套件應用。與傳統的網路協議相比,如 qq等,xmpp 協議並不是乙個基於二進位制方式實現的協議,而是基於 xml技術的...

非同步TCP連線伺服器端

tcptranslate 為傳輸輔助類,此外 不全.待續.using system using system.io using system.text using system.net using system.net.sockets using system.collections.generic...