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 高级进阶》系列所有文章

  • 相关阅读:
    118/119. Pascal's Triangle/II
    160. Intersection of Two Linked Lists
    168. Excel Sheet Column Title
    167. Two Sum II
    172. Factorial Trailing Zeroes
    169. Majority Element
    189. Rotate Array
    202. Happy Number
    204. Count Primes
    MVC之Model元数据
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/2016024.html
Copyright © 2011-2022 走看看