gloox連線至伺服器端

2021-04-22 12:09:05 字數 4415 閱讀 5576

在使用

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

協議伺服器連線開始,一步一步來。

gloox

開發包中,

src裡面有

example

和test

兩個目錄,該目錄下有使用的例子,你可以直接看例子,可以明白如何使用的。我也是通過這些例子,再看源**中的注釋,明白了一些東西的,然後再整理一下,覺得有些收穫,所以把它寫出來。

要想連線伺服器,通常需要下面幾個資訊:伺服器位址

(網域名稱或者

ip位址

),伺服器端口號,使用者帳號,使用者密碼。在

xmpp

協議中,伺服器建議的埠號為

5222

,如果沒其它必要,建議採用該埠號。

xmpp

的使用者帳號別名叫

jid,

jid 

, 並可相容其他即時通訊系統( 如

msn 等) 

: [節點″@″

] 網域名稱[″

/″資源

], 其中各個域的長度不能超過

1 023 

位元組, 

總長度最大為

3 071 

位元組。從

jid的定義可以看出來,其實要連線到伺服器,

jid中就已經含有了伺服器的位址,而如果預設採用

5222

埠號的話,則可以不用提供伺服器位址和埠就可以了,而只通過

jid就可以和伺服器連線上。

我使用的伺服器是

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

virtual ~messagetest() {}

void start() }

//該該方法即為實現

connectionlistener

***介面中的連線成功的方法實現。

virtual void onconnect()

//該該方法即為實現

connectionlistener

***介面中的連線失敗或者 //

斷開網路的方法實現。

virtual void ondisconnect( connectionerror e )

///該該方法即為實現

connectionlistener

***介面中的安全連線成功的方法實現。

virtual bool ontlsconnect( const certinfo& info )

private:

client *j;//

客戶端例項物件

};int main( int /*argc*/, char** /*argv*/ )//

測試**

在連線伺服器中,只要你建立了乙個

client

物件例項,你就可以通過該例項操作了。其實獲得乙個與伺服器的連線,就是獲得乙個

client

例項物件,只要獲得這個例項物件,就擁有了和伺服器的連線(前提是呼叫了

client

物件中的

connect()

該方法)。

另外還需要注意的是,

gloox

內部在連線伺服器時,如果在約

5分鐘內,沒有和伺服器互通訊息的話,會自動斷開連線的,故需要做乙個定時器,在小於5

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...