gloox连接xmpp服务器

先从官网下载gloox的压缩包。

下载地址:http://camaya.net/glooxd/download/
因为gloox是个c++的库,所以我用的是visual studio 2013编译的,以下是主要步骤:
       新建项目32位应用控制台程序->选择空文件的控制台程序,把预编译头去掉。生成了解决方案,,鼠标右键添加新建筛选器,命名gloox,然后把官网下载好的gloox压缩包解压并把src及其下的内容拷贝到项目目录下。。更名为gloox。然后把内容添加到筛选器中。把文件config.h.win拷贝到项目根目录下。。同时鼠标点工程右键属性-》配置属性-》常规-》字符集-》改为使用多字节字符集。(因为utf-8关系)。这时你可以把gloox例子添加到工程里去。然后点击生成解决方案,如若有错,按照提示便可一一解决。。慢慢地,你发现调试运行成功。。修改jid内容以便连接到服务器。。
JID jid( "xiaobin@m3a8o2oybvy1p29/gloox" ); //初始化一个JID,即用户ID
j = new Client( jid, "xiao" );//创建一个连接客户端,后一个参数为密码

对应的jid就是你的admin@domain/resource,下面对应的是你的jid的密码。如若输出connected!!!那么good job!



附上message_example.cpp 例子关键代码分析
//ConnectionListener为一个连接状态信息的//监听器,当连接成功,或者失败时,都
//会调用该监听器中的该方法


class MessageTest : public MessageSessionHandler, ConnectionListener, LogHandler,
                    MessageEventHandler, MessageHandler, ChatStateHandler
{
  public:
    MessageTest() : m_session( 0 ), m_messageEventFilter( 0 ), m_chatStateFilter( 0 ) {}




    virtual ~MessageTest() {}




    void start()
    {




      JID jid( "xiaobin@m3a8o2oybvy1p29/gloox" ); //初始化一个JID,即用户ID
      j = new Client( jid, "xiao" );//创建一个连接客户端,后一个参数为密码
      j->registerConnectionListener( this );
//注册连接状态监听器,当调用该方法后,gloox会在后台自动调用该接口实现中的相应方法。因为this中实现了ConnectionListener接口


      j->registerMessageSessionHandler( this, 0 ); 
      j->disco()->setVersion( "messageTest", GLOOX_VERSION, "Linux" );//设置服务
      j->disco()->setIdentity( "client", "bot" );
      j->disco()->addFeature( XMLNS_CHAT_STATES );
      StringList ca; //关于数字证书认证
      ca.push_back( "/path/to/cacert.crt" );
      j->setCACerts( ca );




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




 //调用j->connect(false)时,即实现与服务器的连接,即登陆了,连接成功会返回//为真。Connect函数参数为false表示不阻塞方式连接,而如果为真,则为阻塞//方式连接
      if( j->connect( false ) )
      {
        ConnectionError ce = ConnNoError;
        while( ce == ConnNoError )
        {
          ce = j->recv();
        }
        printf( "ce: %d\n", ce );
      }




      delete( j );
    }


//该该方法即为实现ConnectionListener监听器接口中的连接成功的方法实现。
    virtual void onConnect()
    {
      printf( "connected!!!\n" );
    }


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


    virtual void onDisconnect( ConnectionError e )
    {
      printf( "message_test: disconnected: %d\n", e );
      if( e == ConnAuthenticationFailed )
        printf( "auth failed. reason: %d\n", j->authError() );
    }


///该该方法即为实现ConnectionListener监听器接口中的安全连接成功的方法实现。
    virtual bool onTLSConnect( const CertInfo& info )
    {
      time_t from( info.date_from );
      time_t to( info.date_to );




      printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n"
              "from: %s\nto: %s\n",
              info.status, info.issuer.c_str(), info.server.c_str(),
              info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(),
              info.compression.c_str(), ctime( &from ), ctime( &to ) );
      return true;
    }




    virtual void handleMessage( const Message& msg, MessageSession * /*session*/ )
    {
      printf( "type: %d, subject: %s, message: %s, thread id: %s\n", msg.subtype(),
              msg.subject().c_str(), msg.body().c_str(), msg.thread().c_str() );




      std::string re = "You said:\n> " + msg.body() + "\nI like that statement.";
      std::string sub;
      if( !msg.subject().empty() )
        sub = "Re: " +  msg.subject();




      m_messageEventFilter->raiseMessageEvent( MessageEventDisplayed );
#if defined( WIN32 ) || defined( _WIN32 )
      Sleep( 1000 );
#else
      sleep( 1 );
#endif
      m_messageEventFilter->raiseMessageEvent( MessageEventComposing );
      m_chatStateFilter->setChatState( ChatStateComposing );
#if defined( WIN32 ) || defined( _WIN32 )
      Sleep( 2000 );
#else
      sleep( 2 );
#endif
      m_session->send( re, sub );




      if( msg.body() == "quit" )
        j->disconnect();
    }




    virtual void handleMessageEvent( const JID& from, MessageEventType event )
    {
      printf( "received event: %d from: %s\n", event, from.full().c_str() );
    }




    virtual void handleChatState( const JID& from, ChatStateType state )
    {
      printf( "received state: %d from: %s\n", state, from.full().c_str() );
    }




    virtual void handleMessageSession( MessageSession *session )
    {
      printf( "got new session\n");
      // this example can handle only one session. so we get rid of the old session
      j->disposeMessageSession( m_session );
      m_session = session;
      m_session->registerMessageHandler( this );
      m_messageEventFilter = new MessageEventFilter( m_session );
      m_messageEventFilter->registerMessageEventHandler( this );
      m_chatStateFilter = new ChatStateFilter( m_session );
      m_chatStateFilter->registerChatStateHandler( this );
    }




    virtual void handleLog( LogLevel level, LogArea area, const std::string& message )
    {
      printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() );
    }




  private:
    Client *j;
    MessageSession *m_session;
    MessageEventFilter *m_messageEventFilter;
    ChatStateFilter *m_chatStateFilter;
};




int main( int /*argc*/, char** /*argv*/ )    main程序作为测试代码。
{
  MessageTest *r = new MessageTest();
  r->start();
  delete( r );
  return 0;
}

参考来源:http://blog.csdn.net/qiuhong101/article/details/3403199

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值