zoukankan      html  css  js  c++  java
  • ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy

        (本文适用于ESFramework V0.2+)

        现在我们回想一下,当网络组件(Tcp/Udp组件)接收到一个消息后,这个消息会流经哪些组件,然后再通过网络组件发送出去了。如果你研究过ESFramework V0.1,你会发现,消息“行走”的路线模型可以用下图表示出来:

        请求消息(路径由黑线表示)经过网络组件后,会被Hook链中的各个Hook按照特定的顺序处理,然后到达消息处理器,消息处理器处理请求消息,并给出回复消息(路径由红线表示),回复消息同样再经过Hook链,然后通过网络组件发送出去。
        我们知道,Hook的主要目的是对截获的消息进行变形处理(比如,加密/解密,压缩/解压等),它会修改消息体的内容。假设我们现在有这样的需求,我们需要在服务端监控接收到的某一特定类型的所有消息,比如,我们的终端用户每隔一定时间会把自己的当前位置(经纬度)通过PositionMessage上报给服务器,服务器需要截获所有这些消息,然后在屏幕的地图上更新表示每个终端用户的点的位置。
        我们需要截获所有的PositionMessage,似乎可以使用Hook,但是,我们并不需要修改PositionMessage的内容,只是Peek它,所以,这与Hook的语义是不一致的。我们需要一种新的组件来反映这个语义,ESFramework(V0.2+)中的INetMessageSpy正是用于此目的。INetMessageSpy与INetMessageHook的区别就恰恰在于,INetMessageSpy只是peek消息内容,而不修改它;而INetMessageHook会对消息进行变形处理。

        应用通常需要在两个地方Spy消息,一个是网关(即网络组件)处,一个是消息处理器附近。对应这两个位置,ESFramework提供了相应的Spy,分别是IGatewayMessageSpy和IInnerMessageSpy,它们都从INetMessageSpy继承。这三个接口的定义如下:

    对应代码如下:
        public interface INetMessageSpy
        {
            
    bool Enabled { set;}
            
    void SpyRecievedMsg(NetMessage msg); //如请求消息
            void SpyToBeSendedMsg(NetMessage msg);//如回复消息
        }
       
        
    public interface IGatewayMessageSpy : INetMessageSpy
        {
        }
       
        
    public interface IInnerMessageSpy : INetMessageSpy
        {
        }
        
        下面的图示将更清楚的展示IGatewayMessageSpy和IInnerMessageSpy位于消息路线图中的位置:

        一目了然!比如上面例子中的监控用户位置的Spy就可以使用IInnerMessageSpy,因为IInnerMessageSpy侦察到的消息都是能够解析的(通常消息到达这里,都已经经过了Hook链的解密、解压缩了)。如果需要监视网关(网络组件)的所有进出消息,则可以使用IGatewayMessageSpy。

        Spy通常用于服务端,对应于Tcp和Udp,ESFramework分别在TcpStreamDispatcher组件和IEsbUdp组件中增加了对Spy的支持。通过TcpStreamDispatcher.InnerMessageSpy属性、TcpStreamDispatcher.GatewayMessageSpy属性、IEsbUdp.InnerMessageSpy属性、IEsbUdp.GatewayMessageSpy属性可以注入你需要使用的Spy。
        
        ok,本文可以结束了,感谢关注!

    上一篇:ESFramework介绍之(29)―― 插件公共设施 AddinUtil

    转到   :ESFramework 可复用的通信框架(序) 
  • 相关阅读:
    C#获取屏幕鼠标所指点的颜色
    C#连接SQLServer数据库基本实现
    论文摘要写法
    红黑树
    递归、迭代和分治法
    逻辑右/左移与算术右/左移
    C 中数字数据类型在不同机器上所占字节数
    十进制转十六进制
    c带头结点的单链表逆置
    求一维数组长度误区
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/402746.html
Copyright © 2011-2022 走看看