zoukankan      html  css  js  c++  java
  • 监控自定义信息 —— 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 概述

    《ESFramework 4.0 快速上手》系列所有文章

    《ESFramework 4.0 高级进阶》系列所有文章

  • 相关阅读:
    HTML语言基础
    过滤器Filter
    新闻实现分页显示
    [转]Jmeter使用入门
    [转]ZK工作原理
    [转]UT-IT-ST-BBIT-SDV-SIT-SVT
    Unix编码哲学
    火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版
    递归公用表表达式概述
    java写word转pdf
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/2016024.html
Copyright © 2011-2022 走看看