ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)

      在ESFramework 4.0 进阶(03)-- 驱动力:通信引擎(上)一文中,我们对ESFramework提供的每一个通信引擎的接口都做了详细了说明,这篇文章我们将继续探讨这些接口的实现类 -- 真正工作的通信引擎类。ESFramework提供了具体的5个通信引擎类覆盖了TCP/UDP、客户端/服务端、 二进制协议/文本协议组合的2x2x2=8种模式。有必要把这个图再贴一下,在具体项目中,大家可以根据需要挑选合适的引擎类。

    ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)_第1张图片

      

一.TCP引擎

    TCP引擎共有三个类:服务端的StreamTcpEngine、服务端的TextTcpEngine、客户端的TcpEngine。

1.服务端引擎

    ESFramework.Engine.Tcp.Server.StreamTcpEngine是基于二进制协议的TCP服务端引擎,ESFramework.Engine.Tcp.Server.TextTcpEngine是基于文本协议的TCP服务端引擎,它们都从ESFramework.Engine.Tcp.Server.BaseTcpEngine继承而来。如下图所示:

          ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)_第2张图片

     BaseTcpEngine实现了ITcpServerEngine接口的所有内容,仅留下部分abstract protected方法由派生类(StreamTcpEngineTextTcpEngine)实现。正如图所表示的那样,StreamTcpEngine与TextTcpEngine最关键的差异在于它们使用的IContractHelper不一样,正如ESFramework 4.0 进阶(01)-- 消息一文中介绍的,IContractHelper用于解析或构造消息。StreamTcpEngine是二进制引擎,必须使用基于二进制的IStreamContractHelper;TextTcpEngine为文本引擎,必须使用基于文本的ITextContractHelper。如果项目在协议格式方面没有特别的需求,我们可以直接使用ESPlus提供的默认的ESPlus.Core.StreamContractHelper实现和ESPlus.Core.TextContractHelper实现。

     BaseTcpEngine需要注入消息分派器MessageDispatcher,只有注入了消息分派器,在引擎接收到消息后,才会驱动我们的骨架流程正常运转起来。

     只要OS支持,BaseTcpEngine内部将采用IOCP模型,以达到最高效的性能。我们常用的windows 2003/2008 Server 肯定是支持IOCP的,在这些系统上运行基于ESFramework的服务端,会自动开启IOCP模型,不需要做特别的设置。

     下面我们就来用代码构造一个StreamTcpEngine实例作为示范: 

    IMessageDispatcher  messageDispatcher  =  ......;
    
IStreamContractHelper  streamContractHelper  =   new  ESPlus.Core. StreamPlusContractHelper ();
    
StreamTcpEngine  streamTcpEngine  =   new   StreamTcpEngine ();
    streamTcpEngine.Port 
=   4530 ;
    streamTcpEngine.MaxMessageSize 
=   100000 ;
    streamTcpEngine.StreamContractHelper 
=  streamContractHelper;
    streamTcpEngine.MessageDispatcher 
=  messageDispatcher;
    streamTcpEngine.Initialize();
    streamTcpEngine.Start();

 

     关于如何组装一个消息分派器messageDispatcher实例,可以参见ESFramework 4.0 进阶(02)-- 核心:消息处理的骨架流程文末提供的代码示例。

 

2.客户端引擎

     ESFramework.Engine.Tcp.Passive.TcpEngine是客户端使用的TCP引擎,其结构图如下:

      ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)_第3张图片

     TcpEngine实现了ITcpPassiveEngine接口的所有内容,并且支持消息发送优先级、断线自动重连等特性。除此之外,还有几点要特别强调一下。

(1)必须设置ContractFormatStyle属性,以表明该引擎是用于文本协议还是二进制协议。

(2)根据ContractFormatStyle属性的值,挂接IStreamContractHelperITextContractHelper到ContractHelper属性。同服务端引擎一样,你可以使用ESPlus提供的默认的StreamContractHelperTextContractHelper

(3)注入MessageDispatcher,以实现消息的分派。

     下面我们就来用代码构造一个TcpEngine实例作为示范:

    IMessageDispatcher  messageDispatcher  =  ...... ;
    
IStreamContractHelper  streamContractHelper  =   new  ESPlus.Core. StreamPlusContractHelper ();
    
TcpEngine  tcpEngine  =   new   TcpEngine ();              
    tcpEngine.ServerIPEndPoint 
=   new  ESBasic.Network. AgileIPEndPoint( " 192.168.0.206 " 4530 ) ;
    tcpEngine.ContractFormatStyle 
=   ContractFormatStyle .Stream;
    tcpEngine.ContractHelper 
=  streamContractHelper;
    tcpEngine.MessageDispatcher 
=  messageDispatcher;
    tcpEngine.MaxMessageSize 
=   100000 ;
    tcpEngine.HandleMessageAsynchronismly 
=   false ;
    tcpEngine.AutoReconnect 
=   true ;
    tcpEngine.QueueSizeOfDiscarded 
=   1 ;
    tcpEngine.QueueSizeOfNonDiscarded 
=   1 ;
    tcpEngine.Initialize();
    tcpEngine.Start();

 

二.UDP引擎 

     UDP引擎只有两个类:用于服务端的UdpServerEngine和用于客户端的UdpPassiveEngine。并且,UdpServerEngineUdpPassiveEngine都是从BaseUdpEngine继承,如下图所示:

     ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)_第4张图片

  BaseUdpEngine实现了IUdpEngine的所有内容,UdpServerEngine和UdpPassiveEngine从其继承复用了这些实现,并再各自实现IUdpServerEngine接口和IUdpPassiveEngine接口。同样的,在使用UdpServerEngine和UdpPassiveEngine的时候,同样要注意:

(1)必须设置ContractFormatStyle属性,以表明该引擎是用于文本协议还是二进制协议。

(2)根据ContractFormatStyle属性的值,挂接IStreamContractHelperITextContractHelper到ContractHelper属性。

(3)注入MessageDispatcher,以实现消息的分派。

(4)如果需要使用UDP增强,则UdpServerEngineUdpPassiveEngine的UseEnhancedUdp属性都必须设为true。 

  首先,示范如何构造一个最简单的UdpServerEngine实例:

    IMessageDispatcher  messageDispatcher  =   ...... ;
    
IStreamContractHelper  streamContractHelper  =   new  ESPlus.Core. StreamPlusContractHelper ();
    
UdpServerEngine  udpServerEngine  =   new   UdpServerEngine ();
    udpServerEngine.ContractFormatStyle 
=   ContractFormatStyle .Stream;
    udpServerEngine.ContractHelper 
=  streamContractHelper;
    udpServerEngine.MessageDispatcher 
=  messageDispatcher;
    udpServerEngine.Port 
=   4520 ;
    udpServerEngine.MaxMessageSize 
=   100000 ;
    udpServerEngine.MaxUdpDatagramLength 
=   10240 ;
    udpServerEngine.HandleMessageAsynchronismly 
=   false ;
    udpServerEngine.
UseEnhancedUdp  =   false ;
    udpServerEngine.Initialize();
    udpServerEngine.Start();

     接下来,我们再构造一个简单的UdpPassiveEngine实例:

    IMessageDispatcher  messageDispatcher  =   ...... ;
    
IStreamContractHelper  streamContractHelper  =   new  ESPlus.Core. StreamPlusContractHelper ();
    
UdpPassiveEngine  udpPassiveEngine  =   new   UdpPassiveEngine ();
    udpPassiveEngine.
ServerIPEndPoint  =   new  ESBasic.Network. AgileIPEndPoint( " 192.168.0.206 " 4520 );
    udpPassiveEngine.ContractFormatStyle 
=  ContractFormatStyle.Stream;
    udpPassiveEngine.ContractHelper 
=  streamContractHelper;
    udpPassiveEngine.MessageDispatcher 
=  messageDispatcher;  
    udpPassiveEngine.MaxMessageSize 
=   100000 ;
    udpPassiveEngine.MaxUdpDatagramLength 
=   10240 ;
    udpPassiveEngine.HandleMessageAsynchronismly 
=   false ;
    udpPassiveEngine.
UseEnhancedUdp  =   false ;
    udpPassiveEngine.Initialize();
    udpPassiveEngine.Start();

 

  到此,关于ESFramework提供的所有通信引擎接口和实现都介绍完了,为了使得讲述更简单更容易理解,我们特意忽略了一些实现机理的介绍,比如,像UDP增强、消息优先级队列、引擎内部实现的原理等等。虽然如此,但是,即使您不了解这些内部实现,也不会影响您高效地使用ESFramework。

     到现在为止,根据我们掌握的知识,我们已经可以将通信引擎以及整个骨架流程正确组装起来了,接下来的章节中,我们要介绍用户管理器、正规消息发送器、以及客户端用的服务器代理、消息收发器、容器模式的消息处理器等等。

     敬请关注!

 

ESFramework 4.0 概述

ESFramework 4.0 有哪些优点?

ESFramework 4.0 版本升级说明(持续更新)

《ESFramework 4.0 快速上手》系列所有文章

《ESFramework 4.0 高级进阶》系列所有文章 

 

你可能感兴趣的:(framework)