gloox连接到服务器(一个XMPP的库)

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协议服务器连接开始,一步一步来。

其实在下载的gloox开发包中,SRC里面有example和test两个目录,该目录下有使用的例子,你可以直接看例子,可以明白如何使用的。我也是通过这些例子,再看源代码中的注释,明白了一些东西的,然后再整理一下,觉得有些收获,所以把它写出来。

要想连接服务器,通常需要下面几个信息:服务器地址(域名或者IP地址),服务器端口号,用户帐号,用户密码。在XMPP协议中,服务器建议的端口号为5222,如果没其它必要,建议采用该端口号。XMPP的用户帐号别名叫JID,JID 惟一确定进行即时消息和在线状态信息通信的独立对象或实体, 并可兼容其他即时通信系统( 如MSN等) 相应的实体标识及其在线状态信息。其语法规则为: [节点″@″]
域名[″/″资源], 其中各个域的长度不能超过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<unistd.h>

#endif

#include<stdio.h>

#include<string>

#if defined(WIN32 ) || defined( _WIN32 )

# include<windows.h>

#endif

//ConnectionListener为一个连接状态信息的//监听器,当连接成功,或者失败时,都

//会调用该监听器中的该方法。如果你对连接状态信息不感兴趣,可以不用继承该

//类,认为连接肯定是成功的。但一般的使用是,需要继承该接口,并实现其中的三个

//虚函数。

class MessageTest: public ConnectionListener

{

public:

MessageTest()  {}

virtual ~MessageTest() {}

void start()

{

//初始化一个JID,即用户ID

JID jid("[email protected]/gloox" );

//创建一个连接客户端,后一个参数为密码

j = new Client( jid,"test" );

//注册连接状态监听器,当调用该方法后,

//gloox会在后台自动调用该接口实现中的相应方法。

j->registerConnectionListener(this );       //因为this中实现了ConnectionListener接口

//j->registerMessageSessionHandler(this, 0 );

//设置服务,具体意思不详,照这样写就可以了(与服务发现有关)

j->disco()->setVersion("messageTest", GLOOX_VERSION, "Linux" );

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

//j->setCompression( false);

// j->setStreamManagement( true,true );

//j->disco()->addFeature( XMLNS_CHAT_STATES );

//关于数字证书认证方面的东东,照抄就行了。

StringList ca;

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

j->setCACerts( ca );

//调用j->connect(false)时,即实现与服务器的连接,即登陆了,连接成功会返回//为真。Connect函数参数为false表示不阻塞方式连接,而如果为真,则为阻塞//方式连接j->connect(true)

//j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this );

//if( j->connect( false ))

//{

////

//}

ConnectionError ce =ConnNoError;

if( j->connect( false ) )

{

while( ce == ConnNoError )

{

ce = j->recv();

}

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

}

delete( j );

}

//该该方法即为实现ConnectionListener监听器接口中的连接成功的方法实现。

virtual void onConnect()

{

printf( "连接服务器成功!!!\n" );

}

//该该方法即为实现ConnectionListener监听器接口中的连接失败或者

//断开网络的方法实现。

virtual void onDisconnect(ConnectionError e )

{

printf( "断开连接: %d\n", e );

delete( j );

}

///该该方法即为实现ConnectionListener监听器接口中的安全连接成功的方法实现。

virtual bool onTLSConnect( constCertInfo& info )

{

return true;

}

private:

Client *j;//客户端实例对象

};

int main( int/*argc*/, char** /*argv*/ )//测试代码

{

MessageTest *r = new MessageTest();

r->start();

//Presence pre =j->presence();//client为创建的那个客户端对象

//j ->setPresence(pre);

delete( r );

return 0;

}

在连接服务器中,只要你创建了一个Client对象实例,你就可以通过该实例操作了。其实获得一个与服务器的连接,就是获得一个Client实例对象,只要获得这个实例对象,就拥有了和服务器的连接(前提是调用了Client对象中的connect()该方法)。

gloox连接到服务器(一个XMPP的库)

时间: 2024-10-10 07:58:30

gloox连接到服务器(一个XMPP的库)的相关文章

System.Net.FtpClient库连接ftp服务器

如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的(socket通信),有一个评价较高的dll库可以供我们使用. 那就是System.Net.FtpClient,链接地址:https://netftp.codeplex.com 然后下载该资源,我们就可以使用它的函数了.这里介绍一下如何使用System.Net.FtpClient链接ftp服务器并下载服务器中的文件. 千万别忘了添加引用——导入System.Net.FtpClient.dll. 还有就是 using System.Net.F

多个客户端如何同时连接到服务器上的一个端口,比如80?(译)

原文:How do multiple clients connect simultaneously to one port, say 80, on a server? [duplicate] 平时我们使用ServerSocket指定了某个端口(例如8080),然后多个客户端连接上socket之后就都用这个8080端口和服务器端通讯.或者http服务器使用80端口也是和多个浏览器进行连接通讯.为什么可以这样呢?操作系统的进程在同个端口的多个连接是如何进行分辨的? 译文: 我们这里讲Socket连接

XMPP客户端库Smack 4.0.6版开发之一

一.Smack库概述 Smack是一个开源.易用的XMPP/Jabber客户端库,它使用Java语言开发,由Jive Software开发. Smack的优点是编程简单. Smack的缺点是其API并非为大量并发用户设计,每个客户都要1个线程,占用资源相对较,因此用Smack做模拟测试时,1台机器只能模拟有限(数千个)客户. 截止2014年11月27日,Smack库已经发展到4.0.6版. 最新的好消息是Smack在4.1.0版后将直接支持Android系统,而无需再使用以前的Smack移植版a

XMPP客户端库Smack 4.0.6版开发之三

XMPP客户端库Smack 4.0.6版开发之三 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 六.建立连接的例子 XMPPConnection类用于创建一个到XMPP服务器的连接,代码例子如下: // 创建一个到jabber.org服务器的连接 AbstractXMPPConnection conn1 = new XMPPTCPConnection("username", "password", "jabb

Comet:基于 HTTP 长连接的“服务器推”技术

“服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 监控系统:后台硬件热插拔.LED.温度.电压发生变化: 即时通信系统:其它用户登录.发送信息: 即时报价系统:后台数据库内容发生变化: 这些应用都需要服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求.“服务器推”技术在现实应用中有一些解决方案,本文将这些解决方案分为两类:一类需要在浏览器端安装插件,基于套接口传送信息,或是使用 RMI.CORBA 进

Aix之 xmanager 2.0连接AIX服务器

xmanager连接AIX服务器可以分为两种情况:1.连接IBM服务器,使用远程桌面功能进行系统维护.要求这台服务器已经安装了图形桌面,如CDE等,并启动到图形界面.在xmanager中的Xbrowser中,输入相应服务器的地址,即可.这种情况能够成功的前提是,服务器已经启动图形桌面. 2.运行图形化安装软件,连接运程服务器,显示其图形界面.如安装oracle,运行dbca建库等. 第一步:打开Xbrowser,在地址栏输入要登录服务器的ip地址,回车.弹出窗口,先不要关闭. 第二步:telne

【转】Comet:基于 HTTP 长连接的“服务器推”技术

原文链接:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新.发送请求.本文首先介绍.比较了常用的“服务器推”方案,着重介绍了 Comet - 使用 HTTP 长连接.无须浏览器安装插件的两种“服务器推”方案:基于 AJAX 的长轮询方式:基于 iframe 及 htmlfile 的流方式.最后分析了开发 Comet 应用需要注意的一些问题

转载:Comet:基于 HTTP 长连接的“服务器推”技术

转自:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新.发送请求.本文首先介绍.比较了常用的“服务器推”方案,着重介绍了 Comet - 使用 HTTP 长连接.无须浏览器安装插件的两种“服务器推”方案:基于 AJAX 的长轮询方式:基于 iframe 及 htmlfile 的流方式.最后分析了开发 Comet 应用需要注意的一些问题,以

[转载] Comet:基于 HTTP 长连接的“服务器推”技术

转载自http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ “服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 监控系统:后台硬件热插拔.LED.温度.电压发生变化: 即时通信系统:其它用户登录.发送信息: 即时报价系统:后台数据库内容发生变化: 这些应用都需要服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求.“服务器推”技术在现实应用中有一些解决