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

简介: 从2004年7月开始,就一直从事N层C/S架构的服务端的开发,时至今日,慢慢的积累了一些开发经验,ESFramework网络通信框架体系便是这些经验的总结。ESFramework网络通信框架这是一套完全可复用的、灵活的、单纯的、支持N层C/S架构的网络通信框架,内置了对Tcp和Udp协议的支持。

  从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保证接收到的每个消息和发送出去的每个消息都能被所有的HookSpy
截获。另外,消息分派器可能需要验证接收到的每个消息格式是否正确、消息是否合法、消息是否符合特定规格等。下面是消息分派器组件的组成:
    
   
    消息分派器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 可复用的(序) 

 

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

目录
相关文章
|
12月前
|
监控 安全
从 Racket 语言出发,创新员工网络监控软件的框架
在数字化企业环境中,员工网络监控软件对于保障信息安全和提升效率至关重要。Racket 语言凭借其独特特性和强大功能,为开发创新的监控软件提供了新可能。通过捕获和分析网络数据包、记录员工网络活动日志,甚至构建复杂的监控框架,Racket 能够满足企业的定制化需求,为企业信息安全和管理提供强有力支持。未来,基于 Racket 的创新解决方案将不断涌现。
140 6
|
3月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
64 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
1月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
|
17天前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
138 0
|
25天前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
|
4月前
|
机器学习/深度学习 API TensorFlow
BayesFlow:基于神经网络的摊销贝叶斯推断框架
BayesFlow 是一个基于 Python 的开源框架,利用摊销神经网络加速贝叶斯推断,解决传统方法计算复杂度高的问题。它通过训练神经网络学习从数据到参数的映射,实现毫秒级实时推断。核心组件包括摘要网络、后验网络和似然网络,支持摊销后验估计、模型比较及错误检测等功能。适用于流行病学、神经科学、地震学等领域,为仿真驱动的科研与工程提供高效解决方案。其模块化设计兼顾易用性与灵活性,推动贝叶斯推断从理论走向实践。
142 7
BayesFlow:基于神经网络的摊销贝叶斯推断框架
|
11月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
437 6
|
12月前
|
机器学习/深度学习 人工智能
类人神经网络再进一步!DeepMind最新50页论文提出AligNet框架:用层次化视觉概念对齐人类
【10月更文挑战第18天】这篇论文提出了一种名为AligNet的框架,旨在通过将人类知识注入神经网络来解决其与人类认知的不匹配问题。AligNet通过训练教师模型模仿人类判断,并将人类化的结构和知识转移至预训练的视觉模型中,从而提高模型在多种任务上的泛化能力和稳健性。实验结果表明,人类对齐的模型在相似性任务和出分布情况下表现更佳。
289 3
|
12月前
|
安全 网络安全 区块链
网络安全与信息安全:构建数字世界的防线在当今数字化时代,网络安全已成为维护个人隐私、企业机密和国家安全的重要屏障。随着网络攻击手段的不断升级,从社交工程到先进的持续性威胁(APT),我们必须采取更加严密的防护措施。本文将深入探讨网络安全漏洞的形成原因、加密技术的应用以及提高公众安全意识的重要性,旨在为读者提供一个全面的网络安全知识框架。
在这个数字信息日益膨胀的时代,网络安全问题成为了每一个网民不可忽视的重大议题。从个人信息泄露到企业数据被盗,再到国家安全受到威胁,网络安全漏洞如同隐藏在暗处的“黑洞”,时刻准备吞噬掉我们的信息安全。而加密技术作为守护网络安全的重要工具之一,其重要性不言而喻。同时,提高公众的安全意识,也是防范网络风险的关键所在。本文将从网络安全漏洞的定义及成因出发,解析当前主流的加密技术,并强调提升安全意识的必要性,为读者提供一份详尽的网络安全指南。
|
7月前
|
监控 安全 Cloud Native
企业网络架构安全持续增强框架
企业网络架构安全评估与防护体系构建需采用分层防御、动态适应、主动治理的方法。通过系统化的实施框架,涵盖分层安全架构(核心、基础、边界、终端、治理层)和动态安全能力集成(持续监控、自动化响应、自适应防护)。关键步骤包括系统性风险评估、零信任网络重构、纵深防御技术选型及云原生安全集成。最终形成韧性安全架构,实现从被动防御到主动免疫的转变,确保安全投入与业务创新的平衡。