gloox与xmpp学习



本文为转载,原文连接:http://blog.sina.com.cn/s/blog_49b531af0102e1lz.html


在使用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 <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( "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 , char** )//测试代码

{

MessageTest *r = new MessageTest();

r->start();

delete( r );

return 0;

}

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

另外还需要注意的是,gloox内部在连接服务器时,如果在约5分钟内,没有和服务器互通消息的话,会自动断开连接的,故需要做一个定时器,在小于5分钟的时候,向服务器发一个消息,具体的消息一般可以用在线状态这种类型的消息。我做的时候,是通过一个定时,然后先获得在席状态,然后再把这个原原本本的再设置一次就可以了,代码是这样的:

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

client ->setPresence(pre); 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值