即时通讯编程(三)
作者:邵盛松 2009-05-30 QQ:346646173
目的:开发基于XMPP(Extensible Messaging and Presence Protocol)协议的即时通讯。
开发工具: Visual C++ 2005
本篇文章主要内容:聊天状态事件的捕获,好友的处理
前提:
更正地方:
在即时通讯(一)编程中的代码
win32下编译添加
#pragma comment(linker,"/subsystem:console ")
就可以用int main( int /*argc*/, char** /*argv*/ )
不需要更改为
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
在即时通讯(二)编程中的代码
CTeClient th;
th.Login(_T("flyfish"),_T("1"),_T("mycomputer"));
delete(th );//如果没有这句,你的客户端会处于无响应状态。
delete(th );这句代码不需要,在栈的内存系统自动释放而在堆上才需要手动释放
这次根据gloox自带的例子message_example.cpp中代码搬到MFC下进行编写,已经将全部代码转移到MFC下,release版调试通过
一 添加对方聊天状态事件的捕捉
也就是可以知道对方正在聊天窗口做什么。
重载gloox::MessageEventHandler类中的handleMessafeEvent虚函数
void CMianClient::handleMessageEvent( const JID& from, MessageEventType event )
{
switch(event)
{
case MessageEventCancel:
{
AfxMessageBox(_T("对方取消输入"));
break;
}
case MessageEventOffline:
{
AfxMessageBox(_T("对方离线"));
break;
}
case MessageEventDelivered:
{
AfxMessageBox(_T("消息已发送"));
break;
}
case MessageEventDisplayed:
{
AfxMessageBox(_T("消息已显示"));
break;
}
case MessageEventComposing:
{
AfxMessageBox(_T("对方正在输入"));
break;
}
default:
break;
}
}
二 好友管理
关于好友的管理,关于好友例子是源码中example文件夹下的roster_example.cpp。
roster_example好友的一些消息处理已在win32编译通过。
下面是一些函数介绍
virtual void onSessionCreateError(SessionCreateError error);
virtual void handleItemSubscribed(const JID& jid);//同意添加用户
virtual void handleItemAdded(const JID& jid);//添加用户
virtual void handleItemUnsubscribed(const JID& jid);//添加用户被拒绝
virtual void handleItemRemoved(const JID& jid);//删除用户
virtual void handleItemUpdated( const JID& jid )//更新用户
virtual void handleRoster( const Roster& roster )
virtual void handleRosterError( Stanza * /*stanza*/ )
virtual void handleRosterPresence( const RosterItem& item, const std::string& resource,Presence presence,
const std::string& /*msg*/ )
virtual void handleSelfPresence( const RosterItem& item, const std::string& resource,Presence presence,
const std::string& /*msg*/ )
virtual bool handleSubscriptionRequest( const JID& jid, const std::string& /*msg*/ )
//handleSubscriptionRequest 函数对方将自己添加好友的请求
virtual bool handleUnsubscriptionRequest( const JID& jid, const std::string& /*msg*/ )
//对方将自己删除的通知
virtual void handleNonrosterPresence( Stanza* stanza )
//如何A不在B的好友当中时,这时 A向B发送消息就会调用 handleNonrosterPresence 函数