5.gloox 之 MessageSession

MessageSession类对象是任意两个实体之间消息会话的抽象。

详细说明:
MessageSession是原始态和老式消息会话形式的一种替代。
原始的接口,它使用简单MessageHandler类的派生类,是基于一种全有或全无的方法。
一旦用ClientBase对象注册此原始接口,则此MessageHandler的派生类会收到发给此ClientBase对象所有的消息节(message stanza),并且不得不自己对消息节进行过虑。
MessageSession向聊天会话中增加了一种抽象。一个MessageSession对象只对一个全JID负责。
此MessageSession对象可以被称作消息过虑器(messageFilters)扩展,以提供另外的功能,

比如:消息事件(MessageEvents), 聊天状态通知(ChatState),或带内字节数据流。

你可以依然使用老式的MessageHandler类,

但是消息不会一起传递到MessageHandler和为那个JID创建的一个MessageSession对象中,
即消息只会递进其中之一,MessageSession具有较高的优先级,消息被传递其中,

而MessageHandler则不会传进消息。

使用MessageSession比使用老式的MessageHandler有如下优点:
1、MessageSession对象自动创建。
2、以JID过虑
3、消息跟踪(thread id)的自动处理
4、简单的消息发送
5、支持消息过虑器(MessageFilters)
用法:
从MessageSessionHandler派生一个对象,重写handleMessageSession()函数在某种结构中存储新的会话,或创建一个新的聊天窗口,或其它。

然后用ClientBase对象的registerMessageSessionHandler()函数注册此对象。例:


void MyClass::myFunc()
 {
   JID jid( "abc@example.org/gloox" );
   j = new Client( jid, "password" );          //以前说过,Client继承自ClientBase类
   [...]
   j->registerMessageSessionHandler( this, 0 );
 }

此时 MyClasss 就是一个MessageSessionHandler。
例子中,MyClass也需要MessageHandler,MessageEventHandler和ChatStateHandler。
以上三种处理器被MessageSession对象注册用来处理各自的事件

virtual void MyClass::handleMessageSession( MessageSession *session )
 {
   // for this example only, we delete any earlier session
   if( m_session )
     j->disposeMessageSession( m_session );
   m_session = session;
   m_session->registerMessageHandler( this );

   // the following is optional
   m_messageEventFilter = new MessageEventFilter( m_session );
   m_messageEventFilter->registerMessageEventHandler( this );
   m_chatStateFilter = new ChatStateFilter( m_session );
   m_chatStateFilter->registerChatStateHandler( this );
 }


当消息事件(Message Events)和聊天状态(Chat States)到达时,
MessageEventHandler::handleMessageEvent()和chatStateHandler::handleChatState()就会分别被调用。

 virtual void MyClass::handleMessageEvent( const JID& from, MessageEventType event )
 {
   // display contact's Message Event
 }

 virtual void MyClass::handleChatState( const JID& from, ChatStateType state )
 {
   // display contact's Chat State
 }

想要让好友知道自己正在输入信息或己经关闭聊天窗口,

则需要分别调用raiseMessageEvent()和setChatState()函数即可,例如:


// user is typing a message
 m_messageEventFilter->raiseMessageEvent( MessageEventComposing );

 // acknowledge receiving of a message
 m_messageEventFilter->raiseMessageEvent( MessageEventDelivered );

 // user is not actively paying attention to the chat
 m_chatStateFilter->setChatState( ChatStateInactive );

 // user has closed the chat window
 m_chatStateFilter->setChatState( ChatStateGone );

向一个MessageSession代表的一个好友聊天会话发送消息,

使用send(const std::string& message,const std::string& subject)函数。
你不必关心消息头,消息追踪(thread id),这些都是自动添加的。


m_session->send( "Hello World!", "No Subject" );

初始化一个聊天会话(chat session),你所做的所有工作就是创建一个MessageSession对象,

并且用它注册一个MessageHandler对象:
MessageSession* MyClass::newSession( const JID& to )
{
   MessageSession *session = new MessageSession( m_client, to );
   session->registerMessageHandler( this );
   return session;
}


关于带内字节流(In-Band Bytestreams)的实现方法,参考InBandBytestreamManager类.
 
注意:你永远不要手工删除一个MessageSession对象,

而是调用ClientBase::disposeMessageSession()来完成这个工作.
 


MessageSession(  ClientBase*     parent,
                            const JID&      jid,
                            bool                wantUpgrade = true;
                            int                   types = 0
)
为给定的JID创建一个MessageSession对象.建议提供一个全JID,也即是,它需要设置一个资源.
如果没有设定资源将导致一个异常.一个消息跟踪(thread id)将被创建并且在整个会话过程中都会与每一个消息一起发送.
参数:
parent    进行通信的ClientBase对象
jid       远程联系人的全Jid。如果你不知道对方的全Jid(大概是普遍情况),

           但又想用MessageSession回应此联系人,那么把wantUpgrade参数
          设为true(或不更改它,即默认true)
wantUpgrade  标示gloox是否尽量匹配发到此MessageSession的一个全JID发来的消息。

                     如果不确定,请使用默认值。
             MesssageSession对象直接与服务器通信或一个没有资源的组件JID,

            这可能是唯一不使用默认值的场合。
             这样的“提升(upgrade)”只发生一次 。
types     这个MessageSession对象应该接收的子节类型(StanzaSubType)列表的值。

             只有StanzaMessage* 类型有效。
            默认值0,指所有类型都被接收。

void disposeMessageFilter(MessageFilter *mf)
 从MessageSession对象中删除一个MessageFilter(消息过滤器)。
  (译注:ChatStateFilter, InBandBytestream,  MessageEventFilter 都继承自MessageFilter)
参数:
    mf   要移除和释放的 MessageFilter对象
注:如果只是移除(不释放)MessageFilter对象,则使用removeMessageFilter()函数。

void  registerMessageFilter(MessageFilter* mf)
使用此函数向MessageSession对象中注册一个新的MessageFilter对象。此过滤器有能力读取和(/或)修改一个消息节的内容。
注意:
    此MessageSession对象将成为此过滤器的宿主,过滤器对象被MessageSession的析构函数删除。
    如果在MessageSession销毁之前,之前摆脱此过滤器,则调用disposeMessageFilter()。


void removeMessageFilter(MessageFilter * mf)
从MessageSession中移除一个MessageFilter对象。

void  registerMessageHandler(MessageHandler* mh)
此函数使MessageSession和一个MessageHandler对象联合起来。此MessageHandler将要收到此MessageSession远程联系人发来的所有消息。

void removeMessageHandler()
此函数将清除内部指针指向的MesssageHandler对象。并且使消息的递送无效。

void resetResource()
此函数重置会话的目标JID,重置成随后发送消息发往的那个JID。服务器确定要递送的最好资源(the server will determine the best resource to deliver to)。当目标资源改变出席时(如,离开

或下线)有用。(原句:This function resets the session's target JID to its bare form such that subsequently sent messages will be sent to that bare JID. The server will

determine the best resource to deliver to. Useful if the target resource changed presence to e.g. away or offline.)

void send( const std::string & message,
           const std::string & subject=""
)
快速地发送一条消息(可选择地,下属内容(subject)),比较方便。这是从MessageSession发送消息的首选方法。
参数:
message 将要发送的消息串
subject 可选择的,将要发送的下属内容

void setThreadID( const std::string & thread)
设定一个消息跟踪的ID值,例如,如果继续一个特殊的消息跟踪。不必手动地设置消息跟踪ID值。


const std::string& threadID()const
默认情况下,一个消息跟踪ID和每条消息一起发送。
返回此会话对象的消息跟踪ID值。

const JID& targer()const
返回此会话远客联系人的JID

int types()const
返回此MessageSession对象(即会话对象)要接收的消息类型列表。只对StanzaMessage* 类型有效。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/night_cat/archive/2009/06/03/4240306.aspx

发表于 @ 2009年06月19日 17:39:00 | 评论( 0 ) | 编辑| 举报| 收藏

旧一篇:gloox 之 MessageHandler  | 新一篇:Gloox发消息
查看最新精华文章 请访问博客首页相关文章
VC++中使用使用winnet类获取网页内容c++ template 的一个例子gloox发消息JBPM Timer Dynamically change durtimeVC9即时通讯编程(二)gloox 之 MessageHandlergloox 接收消息发表评论表 情:          评论内容: 用 户 名:登录 注册 匿名评论 匿名用户验 证 码:  重新获得验证码
  热门招聘职位【天际网】急聘Java应用架构师、高级Java工程师、网页设计师【上海酷娱】高薪急聘服务器主程、服务器程序【创新工场】技术类职位热招,立即加入属于你自己的公司【宽娱数码】诚聘C++应用软件工程师(多媒体/网络方向)、.net开发工程师【团800】No.1团购导航诚聘Ruby on Rails高手!【美国国家仪器】诚聘高级软件 工程师 信号处理软件部门经理【浙江驰海实业】诚聘项目经理,PHP,MYSQL,SEO,测试,运维,策划,设计等职【Infosys】诚聘:J2EE 项目主管/(资深)软件研发工程师/.Net资深软件研发工程师【北京高成长公司】高薪招聘.net各级程序员,欢迎应届生【银行项目】诚聘java前台/后台开发人员多名 及SAS数据分析员,欲试从速!【网路时代】高薪诚聘C++、.net开发工程师【京东商城】诚聘手机开发工程师,软件开发工程师,欲试从速!【天际网】急聘Java应用架构师、高级Java工程师、网页设计师【上海酷娱】高薪急聘服务器主程、服务器程序【创新工场】技术类职位热招,立即加入属于你自己的公司【宽娱数码】诚聘C++应用软件工程师(多媒体/网络方向)、.net开发工程师【团800】No.1团购导航诚聘Ruby on Rails高手!【美国国家仪器】诚聘高级软件 工程师 信号处理软件部门经理【浙江驰海实业】诚聘项目经理,PHP,MYSQL,SEO,测试,运维,策划,设计等职【Infosys】诚聘:J2EE 项目主管/(资深)软件研发工程师/.Net资深软件研发工程师【北京高成长公司】高薪招聘.net各级程序员,欢迎应届生【银行项目】诚聘java前台/后台开发人员多名 及SAS数据分析员,欲试从速!【网路时代】高薪诚聘C++、.net开发工程师【京东商城】诚聘手机开发工程师,软件开发工程师,欲试从速! 公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
江苏乐知网络技术有限公司 提供商务支持
 Email:webmaster@csdn.net
Copyright © 1999-2010, CSDN.NET, All Rights Reserved
 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangmoon/archive/2009/06/19/4283583.aspx

转载于:https://my.oschina.net/limbusnet/blog/11028

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值