先从官网下载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!
//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