zoukankan      html  css  js  c++  java
  • ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)

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

        

          

    一.TCP引擎

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

    1.服务端引擎

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

              

         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引擎,其结构图如下:

          

         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继承,如下图所示:

         

      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。

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

         敬请关注!

  • 相关阅读:
    Spring boot unable to determine jdbc url from datasouce
    Unable to create initial connections of pool. spring boot mysql
    spring boot MySQL Public Key Retrieval is not allowed
    spring boot no identifier specified for entity
    Establishing SSL connection without server's identity verification is not recommended
    eclipse unable to start within 45 seconds
    Oracle 数据库,远程访问 ora-12541:TNS:无监听程序
    macOS 下安装tomcat
    在macOS 上添加 JAVA_HOME 环境变量
    Maven2: Missing artifact but jars are in place
  • 原文地址:https://www.cnblogs.com/sylone/p/6096942.html
Copyright © 2011-2022 走看看