从2004年7月开始,就一直从事N层C/S架构的服务端的开发,时至今日,慢慢的积累了一些开发经验,ESFramework网络通信框架体系便是这些经验的总结。ESFramework网络通信框架这是一套完全可复用的、灵活的、单纯的、支持N层C/S架构的网络通信框架,内置了对Tcp和Udp协议的支持。ESFramework网络通信框架不仅仅提供了一个基础的C/S框架和大量C/S应用中常用的组件,而且在ESFramework网络通信框架框架之上,引入的一个扩展层--ESFramework网络通信框架扩展层,专门用于解决的与具体应用相关的领域问题。

一.ESFramework网络通信框架与消息分派器

(本文原作于2006.03.14,第一次修正于2006.06.06,修正后适用于ESFramework V0.3+)

本来Tcp/udp组件是系统与外界交换消息的唯一进出口,而Tcp组件或Udp组件与我们系统唯一的联系是通过消息分派器IMessageDispatcher,如此一来,就相当于ESFramework规定了消息分派器是我们应用与外界交换消息的进出口。IMessageDispatcher是与协议无关、宿主无关的组件,即,它即可以在使用于TCP协议也可使用于Udp协议,如果使用Remoting的方式通信也可以使用IMessageDispatcher来分派消息;它即可以用在服务端也可以用于客户端,这样的高可复用性使得基于不同底层(如Tcp/Udp、服务端/客户端)构建的上层应用具有高度的统一性,同时使得ESFramework网络通信框架的整个架构更加清晰、学习曲线更平滑。

IMessageDispatcher保证接收到的每个消息和发送出去的每个消息都能被所有的Hook和Spy所截获。另外,消息分派器可能需要验证接收到的每个消息格式是否正确、消息是否合法、消息是否符合特定规格等。下面是消息分派器组件的组成:
    
   
    消息分派器IMessageDispatcher定义如下:
   

    public interface IMessageDispatcher
    {
        IEsbLogger           EsbLogger{set ;}        
        INetMessageHook       NetMessageHook{set ;}//可为EsbNetMessageHook
        IGatewayMessageSpy GatewayMessageSpy{set;}
        IInnerMessageSpy   InnerMessageSpy{set;}

IContractHelper       ContractHelper{set ;}//必须设置
        INakeDispatcher    NakeDispatcher{set ;} //必须设置

NetMessage DispatchMessage(NetMessage reqMsg) ;
        
        /// <summary>
        /// 如所有的SingleMessage在发送之前必须经过IMessageDispatcher的Hook链和Spy
        /// </summary>        
        NetMessage BeforeSendMessage(NetMessage msg) ;

event CbNetMessage MessageReceived ;
    }

从IMessageDispatcher的组件结构图和接口的定义可以看出,IMessageDispatcher保证了将接受到的消息按照规定的顺序经过各个Spy、Hook、消息处理器等组件。任何消息不得例外。即使是系统内部生成的消息(如发给客户端的通知),也必须经过IMessageDispatcher的BeforeSendMessage后才可安全的发送出去。
    IMessageDispatcher的实现如下所示:

    public class MessageDispatcher :IMessageDispatcher
    {
        #region property
        #region Logger
        private IEsbLogger esbLogger = new EmptyEsbLogger() ;
        public  IEsbLogger EsbLogger
        {
            set
            {
                if(value != null)
                {
                    this.esbLogger = value ;
                }
            }
        }
        #endregion

#region NakeDispatcher    
        private INakeDispatcher nakeDispatcher ;
        public  INakeDispatcher NakeDispatcher
        {
            set
            {
                this.nakeDispatcher = value ;
            }
        }
        #endregion

#region NetMessageHook
        private INetMessageHook netMessageHook = new EmptyNetMessageHook() ;
        public  INetMessageHook NetMessageHook 
        {
            set
            {
                this.netMessageHook = value ;
            }
        }
        #endregion

#region InnerMessageSpy        
        private IInnerMessageSpy innerMessageSpy = new EmptyInnerMessageSpy() ;
        public  IInnerMessageSpy InnerMessageSpy
        {
            set
            {
                if(value != null)
                {
                    this.innerMessageSpy = value ;
                }

}
        }
        #endregion
        
        #region GatewayMessageSpy    
        private IGatewayMessageSpy gatewayMessageSpy = new EmptyGatewayNetMessageSpy() ;
        public  IGatewayMessageSpy GatewayMessageSpy
        {
            set
            {
                if(value != null)
                {
                    this.gatewayMessageSpy = value ;
                }
            }
        }
        #endregion

#region ContractHelper
        private IContractHelper contractHelper = null ;
        public  IContractHelper ContractHelper
        {
            set
            {
                this.contractHelper = value ;
            }
        }
        #endregion

public event CbNetMessage MessageReceived;
        #endregion

#region IMessageDispatcher 成员

public NetMessage DispatchMessage(NetMessage reqMsg)
        {
            try
            {
                if(this.MessageReceived != null)
                {
                    this.MessageReceived(reqMsg) ;
                }

this.gatewayMessageSpy.SpyReceivedMsg(reqMsg) ;

NetMessage msgHooked = this.netMessageHook.CaptureReceivedMsg(reqMsg) ;

this.innerMessageSpy.SpyReceivedMsg(msgHooked) ;                
                NetMessage resMsg = this.nakeDispatcher.DispatchMessage(msgHooked) ;
                if(reqMsg == null)
                {
                    return null ;
                }
                
                return this.BeforeSendMessage(resMsg) ;
            }
            catch(Exception ee)
            {
                this.esbLogger.Log(ee.GetType().ToString() ,ee.Message ,"ESFramework.Network.MessageDispatcher.DispatchMessage" ,ErrorLevel.High) ;
                return this.contractHelper.GetResponseByServiceResultType(reqMsg ,ServiceResultType.HandleFailure) ;                    
            }
        }

public NetMessage BeforeSendMessage(NetMessage msg)
        {
            this.innerMessageSpy.SpyToBeSendedMsg(msg) ;
            NetMessage msgHooked = this.netMessageHook.CaptureBeforeSendMsg(msg) ;
            this.gatewayMessageSpy.SpyToBeSendedMsg(msgHooked) ;

return msgHooked ;            
        }

#endregion
    }

我们看到,IMessageDispatcher内部使用了INakeDispatcher组件,INakeDispatcher的职责比较单纯,它针对需要分派的消息调用IDataDealerFactory创建对应的处理器,然后将消息交给处理器处理后,将结果返回。其接口定义如下:

    public interface INakeDispatcher
    {
        NetMessage DispatchMessage(NetMessage msg) ;
    }

INakeDispatcher的实现也非常简单:

    public class NakeDispatcher :INakeDispatcher
    {
        #region DataDealerFactory
        private IDataDealerFactory dataDealerFactory = null ; 
        public  IDataDealerFactory DataDealerFactory
        {
            set
            {
                this.dataDealerFactory = value ;
            }
        }
        #endregion
        
        #region ContractHelper
        private IContractHelper contractHelper = null ; 
        public  IContractHelper ContractHelper
        {
            set
            {
                this.contractHelper = value ;
            }
        }
        #endregion

#region INakeDispatcher 成员

public NetMessage DispatchMessage(NetMessage msg)
        {
            IDataDealer dealer = this.dataDealerFactory.CreateDealer(msg.Header.ServiceKey ,msg.Header.TypeKey) ;
            if(dealer == null)
            {
                return this.contractHelper.GetResponseByServiceResultType(msg ,ServiceResultType.ServiceIsNotExist) ;
            }

return dealer.DealRequestMessage(msg) ;
        }

#endregion
    }

通常,在客户端使用IMessageDispatcher组件时,我们不需要使用GatewayMessageSpy和InnerMessageSpy,如果是这样,那么我们只要不为MessageDispatcher的GatewayMessageSpy属性和InnerMessageSpy属性注入对象就可以了。

上一篇:ESFramework网络通信框架介绍之(4)――消息拦截器INetMessageHook

转到  :ESFramework 可复用的(序)

版权声明:本文为博主原创文章,未经博主允许不得转载。

ESFramework网络通信框架介绍之(5)――消息分派器IMessageDispatcher相关推荐

  1. ESFramework网络通信框架介绍之(2)――网络通信消息NetMessage

    ESFramework网络通信框架与元数据 较之C++而言,.NET是一个更加"动态"的平台,其动态能力建立在反射机制之上,而反射的基础是"元数据". 上文已经 ...

  2. ESFramework网络通信框架介绍之(3)――消息处理器和处理器工厂

    一.ESFramework网络通信框架与消息处理器 无论是服务端还是客户端,都需要对接收到的消息进行处理,在ESFramework网络通信框架中,处理消息的组件称为消息处理器,所有的消息处理器都实现了 ...

  3. ESFramework网络通信框架 4.0 性能测试

    本实验用于测试ESFramework网络通信框架服务端引擎的性能,测试程序使用ESFramework 4.0版本. 一.准备工作 测试的机器总共有3台,都是普通的PC,一台作为服务器,两台作为客户端. ...

  4. 网络通信应用开发利器!—— ESPlus —— ESFramework通信框架的增强库

    概述 ESPlus 是基于网络通信框架ESFramework通信框架通信框架的增强库.为了更贴近实际应用,加快网络通信系统的开发,ESPlus在ESFramework通信框架原生功能的基础上,进行了再 ...

  5. 蚂蚁集团网络通信框架 SOFABolt 功能介绍及协议框架解析 | 开源

    简介:开源网络通信框架 SOFABolt 首次线上直播文字回顾. ,有趣实用的分布式架构频道. 回顾视频以及 PPT 查看地址见文末.欢迎加入直播互动钉钉群 : 30315793,不错过每场直播. 大 ...

  6. java 微信api框架_Java架构学习(五十二)使用框架开发微信微信框架介绍整合微信开发框架WxJava使用微信返回消息模板接口使用WxJava框架发送模板消息http协议参数转义知识...

    一.微信框架介绍 1.access_token是公众号的全局唯一调用接口的凭证,它两个小时更新一次. 获取access_token方法: https请求方式: GET https://api.weix ...

  7. 游戏程序设计 # ch13 开发工具 # 开发语言、开发环境、腾讯开发组件、网络通信和业务框架介绍

    第十三章 开发工具 1 开发语言 2 开发环境 3 腾讯开发组件介绍 4 网络通信+业务框架介绍 第一节 开发语言 腾讯服务器主要使用的语言是C/C++ 第二节 开发环境 (指:客户端) 第三节 腾讯 ...

  8. ❤️六万字《SpringMVC框架介绍—从入门到高级》(建议收藏)❤️

    <SpringMVC框架介绍>(建议收藏) ❤️希望博友给个三连+关注!!! SSM: mybatis + Spring + SpringMVC MVC三层架构 SpringMVC + V ...

  9. Github优秀的开源框架介绍

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择 (Best Match) 得到的结果, 然后过滤了跟A ...

最新文章

  1. ThinkPHP里面Model的数据类型问题
  2. c语言标准io中可读可写,C语言标准IO: [先读再feof] VS [先feof再读]
  3. 通过反射获取带参构造方法并使用
  4. lt、le、eq、ne、ge、gt的含义
  5. 作风和个性特点伪原创工具
  6. golang 学习记录
  7. Java里面长什么样,Java对象在JVM中长啥样
  8. Decorator 装饰模式
  9. 【二叉树】剑指offer:二叉树中序遍历的下一个节点
  10. 2017.3.28杂感
  11. 数据库系统工程师考试试题分类精解pdf
  12. TensorFlow学习记录:saved_model模块的用法
  13. Linux系统下安装matla版libsvm
  14. 笔记本屏幕给另一台当扩展屏幕_chenjie的博客
  15. 毕设 JAVA JSP工资管理系统的设计与实现论文
  16. tmux系列:3、tmux窗口和窗格
  17. torchnet.meter使用教程
  18. linux 试题(包含答案)
  19. APP自动化定位方法
  20. 如何讲好一个商业故事(人力资源)

热门文章

  1. 创建 Refs 的几种方式
  2. java obj1 = obj2_无障碍assertEquals(Object obj1,Object obj2),想怎么比较就怎么比较!! [ 光影人像 东海陈光剑 的博客 ]...
  3. php负载均衡如何获得真实ip,nginx负载均衡后端RS中获取真实ip
  4. mysql 存储过程 大于等于_mysql 存储过程 大于
  5. php sql注入审计,php审计基础一:sql注入
  6. 从一张表里选择一列加入到另一张表_将Excel多个文件汇总到一张表
  7. java正则表达式获得html字符串中图片的url地址
  8. jquery.validator验证后ajax提交出现错误解决
  9. VB 一行代码的诀窍
  10. AI如何变革家居软装?拍图就能搜商品,深度学习平台飞桨新玩法