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

转载于:https://www.cnblogs.com/zhuweisky/archive/2006/05/17/402746.html

ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy相关推荐

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

        这是一篇迟到了很久的文章,要不是今天看到Mediar朋友写的"基于ESFramewok的 客户端和客户端通迅"的文章,我也许还不会想起写这篇应该很早就发表的Blog,它可以 ...

  2. ESFramework介绍之(16)―― Tcp数据自动发送器ITcpAutoSender

    我们已经积累了这样的经验:如果有一个大块的数据需要通过Tcp发送,我们会采用异步的方式以避免当前工作线程阻塞.那么,如果我们有多个线程需要同时发送大块的数据了?每个线程都在NetworkStream或 ...

  3. ESFramework介绍之(23)―― AgileTcp

    前面已经介绍了ITcp接口,而AgileTcp就是ESFramework给出的ITcp的参考实现.在之前,我曾经讲解过模拟完成端口的Tcp组件实现和异步Tcp组件实现,在它们的基础之上,我更改了处理策 ...

  4. ESFramework介绍之(14)-- AS与FS通信方案

    前面我们已经多次提到,每个AS都有一组FS为之服务(回顾),AS将接收到的功能请求通过Tcp连接池 或Remoting转发给某个FS处理.下面我们将深入讨论AS和FS之间的通信机制. 首先要解决第一个 ...

  5. ESFramework介绍之(34)―― ITcpServerAgent和IUdpServerAgent组件关系图

        (本文适用于ESFramework V0.3+) 在ESFramework介绍之(7)-- 服务器代理IServerAgent(2006.06.06修正) 的介绍中,我们已经认识了IServe ...

  6. ESFramework介绍之(28)―― Udp组件

        ESFramework对Tcp和Udp协议都提供了完整的支持,在ESFramework介绍之(21)-- Tcp组件接口ITcp介绍 和 ESFramework介绍之(23)―― AgileT ...

  7. 微信消息推送神器【一封传话】介绍,让消息推送更简单

    背景 对于很多个人开发和企业级别的软件开发来说,经常会遇到一些消息推送的场景.如设备报警消息推送.每日天气预报和大盘资讯简报推送等,例如微信公众号消息推送.钉钉消息推送等. 这里以微信消息推送举例,原 ...

  8. ROS系列——mavros功能包中常用话题和服务介绍,包括消息名称、类型、头文件、成员变量、示例代码

    ROS系列--mavros功能包中常用话题和服务介绍,包括消息名称.类型.头文件.成员变量.示例代码 官方链接 常用话题 订阅 1.1 系统状态 1.2 GPS数据 1.3 本地位置 1.4 三轴速度 ...

  9. 微信消息推送神器pushplus介绍,让消息推送更简单

    很早之前曾经做过微信公众号消息推送,实现了一些有意思的小功能.如设备报警消息推送.每日天气预报和大盘资讯简报推送等,使用的是微信官方的api.后台使用golang做了个简单的服务,操作使用上是有点儿麻 ...

最新文章

  1. LeetCode 406 Queue Reconstruction by Height
  2. linux7主机名设置,centos7主机名、网络设置
  3. Android 小项目之--Mini音乐播放器【简单版】(附源码)
  4. 网络排错模型之我见----模型,基线,协议,数据包
  5. 001-pro ant design 升级2.0后变更
  6. 【原】人生的程序公式
  7. [编写高质量代码:改善java程序的151个建议]后记
  8. 杜月笙的六句忠告,学会了不吃亏
  9. Ansible8:Playbook循环
  10. 报错:libtool: Version mismatch error. This is libtool 2.4.6解决
  11. Sharepoint对List增删改操作
  12. vue中引入高德地图获取坐标
  13. MySQL索引失效、优化的方法
  14. 字体变体font-variation-*
  15. Eth-Trunk 链路聚合
  16. LeetCode781森林中的兔子题解
  17. Oracle10g或Oracle11g完全卸载正确步骤(亲身体验-详细图文教程)
  18. 虾皮的发货模式是什么?怎么发货?
  19. Echarts 如何实现一张图现切换不同的X轴
  20. 从Bitly构建分布式系统中吸取的教训

热门文章

  1. ansible内置模块
  2. promo和promotion
  3. 记一个bug定位与修复过程
  4. 通过java提供的URL类包读取网上的文件
  5. OCP 论证书籍 -- ORACLE DATABASE 10G OCP Certification All-in - One Exam Guide
  6. AndroidManifest Intent-Filter Action android:name属性
  7. android Matrix图片变换处理
  8. 2016年腾讯产品笔试真题
  9. 更改SYS密码,expiry_date 过期时间 没有更新,普通用户更改密码会更新
  10. [BZOJ2599]Race