即时通讯编程(二)
作者:邵盛松 2009-05-30 QQ:346646173
目的:开发基于XMPP(Extensible Messaging and Presence Protocol)协议的即时通讯。
开发工具: Visual C++ 2005
本篇文章主要内容:编译第一个MFC环境下的程序
一win32环境下代码更改
首先需要自己架设一台jabber服务器。在这台服务器进行测试
下面是按照自己服务器的配置进行更改
JID jid( "[email protected]/gloox" );//hurkhurk表示用户名称,example.net表示你要连接的机器名字,gloox表示一个用
户标识
j = new Client( jid, "hurkhurks"); //hurkhurks这个是用户的密码
还有将下面这段代码注释掉
/* 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( (const time_t*)&info.date_from ),
ctime( (const time_t*)&info.date_to ) );*/
上面得代码debug下出错,所以就注释掉了
file:loctime64.c
line:78
至此就可以连接到自己配置的服务器上
二 学习在MFC环境下编写登录到服务器功能
在MFC下花费了一天的时间,本来想自己封装一个类,后来类是由xledoo提供,在这里感谢xledoo。也感谢帮助我调试程序的那位暂
时不知姓名的朋友。
建立一个对话框程序。将头文件和实现添加到项目中去。
下面的类由xledoo提供 ,此类可由上面的win32程序改编
class CTeClient : public CDialog, PrivateXMLHandler, ConnectionListener, PresenceHandler
{
public:
void Login(CString Username, CString Password, CString toServer);
virtual void handlePresence(Stanza* stanza);
virtual void onConnect();
virtual bool onTLSConnect(const CertInfo& info);
virtual void gloox::ConnectionListener::onDisconnect(gloox::ConnectionError);
PrivateXML* privateXmlHandler_;
virtual void CTeClient::handlePrivateXML( const std::string& tag, Tag *xml )
{
}
virtual void CTeClient::handlePrivateXMLResult( const std::string& uid, PrivateXMLResult pxResult )
{
}
private:
VCardManager *m_vManager;
};
Login(CString Username, CString Password, CString toServer)
登陆函数,参数是用户名称,密码,服务器名称
handlePresence函数正在处理出席事件
onConnect函数表示正在建立连接
onTLSConnectTLS函数表示信任连接
onDisconnect断开连接
。
需要注意的地方是debug下编译的lib库要对应debug版本,release下编译的lib库要对应release版本
字符集要设置成多字节。
上面得类我已上传,提供下载。同时打包了release版的lib库。注意我的gloox.lib和gloox.dll是在vc2005下编译。使用别的编译
器的朋友需要自己编译一下。
在对话框上添加一个按钮,添加如下事件代码。
CTeClient th;
th.Login(_T("flyfish"),_T("1"),_T("mycomputer"));
delete(th );//如果没有这句,你的客户端会处于无响应状态。
最后别忘了在dlg文件中添加#include "TeGloox.h"
虽然此类只有一个小小的功能,今后我会不断的将其完善。
上面的代码已经在 Visual c++2005下调试通过