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 可复用的通信框架(序) 

时间: 2024-09-20 14:51:54

ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy的相关文章

ESFramework介绍之(31)―― 消息分类及对应的处理器

    这是一篇迟到了很久的文章,要不是今天看到Mediar朋友写的"基于ESFramewok的 客户端和客户端通迅"的文章,我也许还不会想起写这篇应该很早就发表的Blog,它可以帮助ESFramework的研究者/使用者们更好的使用ESFramework.Mediar朋友的那篇文章中介绍了通过服务器转发P2PMessage,Mediar手动实现了一个自己的处理器,实际上ESFramework已经内置了P2PMessage的处理器,那就是P2PMessageDealer,P2PMess

ESFramework介绍之(32)―― Tcp客户端核心组件关系图

    如果你的客户端基于ESFramework构建,并使用Tcp与服务端通信.通过这篇文章你将知道如何迅速.高效地创建客户端应用.     ESFramework对基于Tcp客户端的支持主要在ESFramework.Network.Tcp.Passive命名空间,下图给出了该命名空间中的核心组件,以及这些组件之间的关系:    下面解释一下这些组件的作用.职责.我们从最底层的通信组件NetworkStream向上看:(1)NetworkStream 即是System.Net.Sockets.N

ESFramework介绍之(4)――消息拦截器INetMessageHook

    网络上传输的消息经常是经过加密和压缩,有的特定类型的消息可能还需要进行其它变形,ESFramework通过INetMessageHook对这些功能提供支持.需要说明的是,ESFramework对消息进行截获(Hook)处理有两种方式,一是仅仅Hook处理消息主体(Body),而不对消息头作任何变换:另一种方式是对整个消息(包括消息头和主体)都进行Hook处理.通常,第一种方式已经能够满足我们的大多数应用,并且效率也更高,如果应用有更特殊的要求,可以采用第二种方式.本文先介绍第一种方式,后

ESFramework介绍之(17)―― 支持漫游用户和跨区域功能请求

    对于漫游用户的支持和跨区域功能请求的支持是ESFramework最基本的目的之一(回顾),在详细讲述解决方案之前,先了解一下关于这个问题的上下文.    在我们前面讲述的4层C/S架构中,每个AS负责一块区域.比如上海AS负责处理所有目标城市为上海的功能请求和管理所有在上海AS上注册的用户(比如PDA用户或手机用户).如果一个本是在上海注册的用户出差来到了武汉,最方便的,他会连上武汉的AS,这样对于武汉AS来说,这个用户就是漫游用户了.    如果上海的用户登陆上了上海的AS,但是他需要

ESFramework介绍之(8)-- 客户端插件IPassiveAddin

    前文已经提到了,在IServerAgent的基础上,客户端也可以采用插件的结构形式,客户端插件需要实现IPassiveAddin接口.    我的想法是,当客户端主程序加载一个新的PassiveAddin时,可以在某个菜单的子Items上添加一项,当双击这个子菜单项时,则弹出该客户端插件提供的"业务操作窗体".这只是使用客户端插件的可行方式之一,你完全可以根据你的应用来决定使用形式.IPassiveAddin接口定义如下:  1     /// <summary> 

ESFramework介绍之(18)―― Tcp用户管理器组件

    当我们的应用中客户端与AS之间是通过Tcp进行通信的时候,通常,应用也要求管理所有在线的用户.这种管理至少包含以下几点:(1) 当用户上线时,记录上线时间(2) 当用户请求服务时,记录请求服务的时间.服务的类型.本次服务下载的数据量(3) 当用户下线时,记录下线时间.并把本次用户登录.请求服务过程中的所有信息持久化保存(如记录到数据库)     在ESFramework中,实现这种管理的是ITcpUserManager组件,通常,该组件由AS使用(因为在AS.FS.IRAS中只有AS是必

ESFramework介绍之(13)-- 功能插件处理器工厂

    上文讲述的是AS中的基于连接池的消息处理器,现在我们把焦点转移到功能服务器FS上来,看看FS上消息分派的过程.当FS接收到到一个请求后,会从已加载的功能插件列表中选择一个合适的插件来处理这个消息,而每一个功能插件就相当于一个消息处理器.FS和AS的结构一致:    要注意的是,功能服务器FS上收到的所有消息都应该交给功能插件来处理,不存在其它的处理方式.这是使得FS"纯粹"的必须要求.上图已经很清楚的表示了功能插件处理器工厂的位置和作用.它借助插件管理器实现"工厂&q

ESFramework介绍之(9)-- 插件对(Addin Pair)调试“框架”

    使用ESFramework开发C/S(通常为4层.3层也没问题)应用,当需要增加一项新的业务时,我们需要做的仅仅是开发两个插件,一个是服务端的业务功能插件(FunAddin),一个是客户端插件(PassiveAddin),这两个插件合在一起称为Addin Pair.开发这两个插件,只需要关注于业务,而其它与业务无关的比如网络通信.加密.数据安全,都不用管.ESFramework很好的将这些关注点分离开来,使得写"业务"插件的程序员的工作变得非常单纯,在ESFramework介绍

AS与FS通信实现 —— ESFramework介绍之(33)

    (本文部分内容只适合ESFramework V0.3+)     在ESFramework介绍之(14)-- AS与FS通信方案 一文中,我们讲到了AS与FS之间基本的通信方案,并且采取了一些策略来保证AS与FS之间的稳定通信.本文我们将给出AS与FS通信的两种实现,即基于Tcp连接池的通信实现和基于Remoting的通信实现.     我们已经知道,AS与FS之间的通信分为两类,一类是非功能通信,一类是功能通信.非功能通信指的是FS向AS注册.注销等通信,这种通信仅仅是FS主动联系AS