gloox連線到伺服器(乙個XMPP的庫)

2021-06-22 18:55:13 字數 2993 閱讀 4443

gloox連線至伺服器端

在使用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協議伺服器連線開始,一步一步來。

] 網域名稱[″/″資源], 其中各個域的長度不能超過1 023 位元組, 總長度最大為3071 位元組。從jid的定義可以看出來,其實要連線到伺服器,jid中就已經含有了伺服器的位址,而如果預設採用5222埠號的話,則可以不用提供伺服器位址和埠就可以了,而只通過jid就可以和伺服器連線上。

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

現在假設我已經註冊了乙個使用者名為:test

,密碼為:test的帳號,後面我將用這個帳號進行和伺服器的連線,即登陸。

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

#include"client.h"

#include"connectionlistener.h"

#include"disco.h"

#include"stanza.h"

#include"gloox.h"

#include"lastactivity.h"

#include"connectiontcpclient.h"

using namespacegloox;

#ifndef _win32

# include

#endif

#include

#include

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

# include

#endif

//connectionlistener

為乙個連線狀態資訊的

//***,當連線成功,或者失敗時,都 //

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

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

虛函式。

class messagetest: public connectionlistener

virtual ~messagetest() {}

void start()

connectionerror ce =connnoerror;

if( j->connect( false ) )

printf( "ce: %d\n", ce ); }

delete( j ); }

//該該方法即為實現

connectionlistener

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

virtual void onconnect()

//該該方法即為實現

connectionlistener

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

斷開網路的方法實現。

virtual void ondisconnect(connectionerror e )

///該該方法即為實現

connectionlistener

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

virtual bool ontlsconnect( constcertinfo& info )

private:

client *j;//

客戶端例項物件 };

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

測試**

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

SQL連線到伺服器

1.伺服器型別 資料庫引擎 3.身份驗證 windows身份驗證 不需要新增登入名和密碼就可以直接進行連線。前提是需要登入資料庫所在的電腦。sql server身份驗證 在無法登入資料庫所在電腦,只能訪問sql server的條件下,只能使用此方式進行驗證,它需要輸入登入名與密碼。在使用sql se...

gloox連線至伺服器端

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

gloox連線至伺服器端

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