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 可复用的通信框架(序) 
posted @ 2006-05-17 19:15  zhuweisky  阅读(2739)  评论(3编辑  收藏  举报