即时通讯编程(三)

时间:2021-02-24 12:25:40

即时通讯编程(三)

作者:邵盛松  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 函数