监控自定义信息 —— ESFramework 4.0 快速上手(10)
在ESFramework 4.0 进阶(02)-- 核心:消息处理的骨架流程一文中,我们介绍了通过挂接IMessageSpy到骨架流程,我们就可以监控到所有收发的消息。由于Rapid引擎已经为我们组装好了默认的骨架流程,如果使用Rapid引擎,我们就无法插入自定义的IMessageSpy。不过没关系,使用Rapid引擎的我们同样可以在服务端监控到客户端发出的所有自定义信息。
一.深入ICustomizeInfoOutter接口
我们已经非常熟悉ICustomizeInfoOutter接口了,客户端要发送任何自定义的信息,都是通过该接口来进行的。
public interface ICustomizeInfoOutter :IOutter
{
/// <summary>
/// 向服务器发送二进制信息。
/// </summary>
void Send(int informationType, byte[] info); /// <summary>
/// 向服务器提交请求信息,并返回服务器的应答信息。如果超时没有应答则将抛出Timeout异常。
/// </summary>
/// <param name="informationType">自定义请求信息的类型</param>
byte[] CommitRequest(int informationType, byte[] info); /// <summary>
/// 向在线目标用户提交请求信息,并返回应答信息。如果目标用户不在线,或超时没有应答则将抛出Timeout异常。
/// </summary>
byte[] CommitP2PRequest(string targetUserID, int informationType, byte[] info); /// <summary>
/// 向在线用户targetUserID发送二进制信息。如果目标用户不在线,则服务端会调用ICustomizeInfoBusinessHandler.OnTransmitFailed方法来通知应用程序。
/// </summary>
void Send(string targetUserID, int informationType, byte[] info); /// <summary>
/// 向目标组内所有在线用户广播二进制信息。(服务端采用Post)
/// </summary>
void BroadcastInGroup(string groupID, int informationType, byte[] info);
}
该接口的所有方法可以分为两类:一类方法是接收自定义信息的最终用户是服务端;另一类是接收自定义信息的最终用户是其他在线用户。无论是哪种情况,信息都会到达服务端,或由服务端处理、或经服务端转发。(如果客户端之间开启了P2P通道,则另当别论。)所以,在服务端是可以监控到客户端通过ICustomizeInfoOutter接口发出的所有自定义信息的。
另外,关于同步调用服务端(CommitRequest方法)或同步调用其它客户端(CommitP2PRequest),所发出的自定义信息也是如此,而且同步调用其它客户端时的返回信息也是经过服务器转发的,所以,也可以被监控到。
二.截获自定义信息
在服务端,我们可以预定ICustomizeInfoController接口的InformationReceived事件,来截获客户端发出的所有自定义信息。
event CbGeneric<Information> InformationReceived;
(1)当收到来自客户端的任何自定义信息时,将触发该事件。要特别注意的是,该事件的处理函数不能抛出异常,否则将导致后续消息处理流程中断。所以,最好在该事件的处理函数中catch所有的异常。
(2)该事件处理函数应尽快返回。因为服务端只有在所有的事件函数执行完毕后,才会继续后续的消息处理流程,所以该事件处理函数返回得越快越好。如果有些处理函数的业务逻辑复杂,比较费时,可以考虑使用异步的方式。
(3)ICustomizeInfoOutter接口发出的所有自定义信息都包含了相同几个方面的内容:自定义信息的类型、自定义信息的数据、信息的接收者。ESPlus使用Information类来封装这些内容,并且增加了SourceID属性以记录发送者的UserID。InformationReceived事件只有一个Information类型参数。
public class Information
{
#region SourceID
private string sourceID = "";
/// <summary>
/// 信息的发送者。可以为UserID或者NetServer.SystemUserID。
/// </summary>
public string SourceID
{
get { return sourceID; }
set { sourceID = value; }
}
#endregion #region DestID
private string destID = "";
/// <summary>
/// 信息的接收者。可以为UserID或者NetServer.SystemUserID或GroupID(广播消息)。
/// </summary>
public string DestID
{
get { return destID; }
set { destID = value; }
}
#endregion #region InformationType
private int informationType = 0;
/// <summary>
/// 自定义信息类型
/// </summary>
public int InformationType
{
get { return informationType; }
set { informationType = value; }
}
#endregion #region Content
private byte[] content = null;
/// <summary>
/// 信息的内容
/// </summary>
public byte[] Content
{
get { return content; }
set { content = value; }
}
#endregion
}
注意,如果自定义信息的接收者为服务端,则DestID属性的值是NetServer.SystemUserID(即 "_0")。
(4)当预定了InformationReceived事件后,我们可以根据InformationType来筛选那些我们感兴趣的自定义信息,并对它们做一些记录或其它业务处理。
三.更多说明
服务端通过预定ICustomizeInfoController接口的InformationReceived事件,只能监控到客户端由ICustomizeInfoOutter接口发出的自定义信息,而不能监控到其它命名空间下的Outter接口发送的消息(注意这里的用词是消息,“自定义信息”特用于ESPlus.Application.CustomizeInfo空间),比如客户端通过IBasicOutter接口发出的消息,在服务端是不会触发InformationReceived事件的,它们属于不同的命名空间,是相互独立的。
服务端如果要得到更多的通知,比如用户上下线,就可以通过预定IUserManager接口的相关事件来做到。
如果,你所用的版本的ICustomizeInfoController接口没有InformationReceived事件,请到ESFramework 4.0 概述文末下载最新版本。
监控自定义信息 —— ESFramework 4.0 快速上手(10)的更多相关文章
- 离线消息如何实现?-- ESFramework 4.0 快速上手(02)
在ESFramework 4.0 快速上手一文中,主要介绍了如何使用ESPlus.Rapid命名空间中的引擎来快速地构建基于TCP的网络通信系统,即使是使用ESPlus.Rapid来进行ESFrame ...
- ESFramework 4.0 快速上手(01) -- Rapid引擎
(在阅读该文之前,请先阅读 ESFramework 4.0 概述 ,会对本文的理解更有帮助.) ESFramework/ESPlatform 4.0 的终极目标是为百万级的用户同时在线提供支持,因为强 ...
- 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)
在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...
- ESFramework 4.0 快速上手(06) -- Rapid引擎(续)
<ESFramework 4.0 快速上手>系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine.其实,大家 ...
- 如何使用自定义消息?--ESFramework 4.0 快速上手(04)
在ESFramework 4.0 快速上手一文中,我们讲述了如何使用Rapid引擎可以快速地上手ESFramework开发,文中介绍了使用ESPlus.Application.CustomizeInf ...
- 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)
本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...
- 客户端登录验证 -- ESFramework 4.0 快速上手(15)
在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实现.在2011.04.25发布的新版本中,客户端Rapid引擎,则内置了 ...
- 文件传送,如此简单--ESFramework 4.0 快速上手(13)
在所有的通信系统中,文件传送是最常见也是最重要的功能之一,ESFramework对文件传送的强大支持也是其亮点之一,使用ESFramework可以非常轻松地实现与文件传送相关的所有需求.ESPlus. ...
- 使用紧凑的序列化器,数倍提升性能 —— ESFramework 4.0 快速上手(11)
在分布式通信系统中,网络传递的是二进制流,而内存中是我们基于对象模型构建的各种各样的对象,当我们需要将一个对象通过网络传递给另一个节点时,首先需要将其序列化为字节流,然后通过网络发送给目标节点,目标节 ...
随机推荐
- Hololens Rest API
通过Hololens提供的 Rest API 可以对Hololens进行远程控制和获取信息 ,可以通过第三方程序对Hololens重启或者关机,当然,还有更多更丰富的API,例如可以在PC上分流显示H ...
- openstack私有云布署实践【9.3 主从controller单向同步glance-image目录】
采用Rysnc单向同步,而不用双方实时同步,原因是在历史的运行过程中,我们发现,有些镜像包太大,当在主用的glance将镜像保存时,并不是一时半会就把镜像保存好,当主用在保存时,备用节点又在实时同步那 ...
- 2.MyBatis有代理增删改
2.1 创建一个javaweb项目MyBatis_Part1,并创建如下sql脚本 create user holly identified by sys; grant dba to holly; c ...
- Chapter 16_5 单一方法
当一个对象只有一个方法时,可以不用创建接口table,但是要将这个单独的方法作为对象来返回.可以参考迭代器那一节,是如何构造一个迭代器函数,那个函数将状态保存为closure. 一个具有状态的迭代器是 ...
- 【IE6的疯狂之三】IE6 3像素BUG的实例
问题:2列布局.左列固定,右列液态我需要做一个布局.2列,左边列固定宽度.右边列使用剩余宽度.整体宽度不固定,这样不管在17 还是19的屏幕上,左边列始终宽度不变,右边列宽度始终占据剩余宽度.但是我写 ...
- 为 ngui TweenPosition 添加 pingpongone
//---------------------------------------------- // NGUI: Next-Gen UI kit // Copyright © 2011-2015 T ...
- BGP多线单IP技术实现形式以及其他双线对比
自从电信与网通分离之后,北方网通与南方电信网络的互联瓶颈问题一直没有得到很好的解决,这个问题也严重困扰广大的ICP服务商.ICP也只能根据自己网站主流用户群是在南方还是在北方,服务重点是在南方还是北方 ...
- 二十七、oracle 例外
一.例外分类oracle将例外分为预定义例外.非预定义例外和自定义例外三种.1).预定义例外用于处理常见的oracle错误.2).非预定义例外用于处理预定义例外不能处理的例外.3).自定义例外用于处理 ...
- 基于jdk调用天气服务案例及问题
问题1:解析wsdl文件时出现 把网络上的wsdl保存到本地,把圈起来的那段删掉 代码: 当返回结果不是String类型时: 输入城市编码去查找 所以: 问题二:如果把本地wsdl文件删除的话需要 三 ...
- 昨天面试遇到的一道C语言题
楼主之前是做C/C++开发的,今年转到java,hadoop方向了,所以很多C/C++的细节都有些模糊了,碰巧这次面试题中,就出了一道C指针的问题. 问题不算难,但楼主一时之间竟也想不起来答案了... ...