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方法由派生类(StreamTcpEngine、TextTcpEngine)实现。正如图所表示的那样,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属性的值,挂接IStreamContractHelper或ITextContractHelper到ContractHelper属性。同服务端引擎一样,你可以使用ESPlus提供的默认的StreamContractHelper或TextContractHelper。
(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。并且,UdpServerEngine和UdpPassiveEngine都是从BaseUdpEngine继承,如下图所示:
BaseUdpEngine实现了IUdpEngine的所有内容,UdpServerEngine和UdpPassiveEngine从其继承复用了这些实现,并再各自实现IUdpServerEngine接口和IUdpPassiveEngine接口。同样的,在使用UdpServerEngine和UdpPassiveEngine的时候,同样要注意:
(1)必须设置ContractFormatStyle属性,以表明该引擎是用于文本协议还是二进制协议。
(2)根据ContractFormatStyle属性的值,挂接IStreamContractHelper或ITextContractHelper到ContractHelper属性。
(3)注入MessageDispatcher,以实现消息的分派。
(4)如果需要使用UDP增强,则UdpServerEngine与UdpPassiveEngine的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 进阶(04)-- 驱动力:通信引擎(下)的更多相关文章
- 驱动力—— 通信引擎(上)—— ESFramework 4.0 进阶(03)
在ESFramework 4.0 进阶(02)-- 核心:消息处理的骨架流程一文中我们详细介绍了ESFramework中消息处理的骨架流程,并且我们已经知道,ESFramework中的所有通信引擎使用 ...
- 垂直分割群集模型与多通道引擎 -- ESFramework 4.0 进阶(10)
在ESFramework 4.0 进阶(09)-- ESPlatform 支持的三种群集模型一文中,我们介绍了ESPlatform支持的三种群集模型 -- 垂直分割模型.水平分割模型.交叉模型.我们看 ...
- 在线用户管理--ESFramework 4.0 进阶(05)
无论我们采用何种通信框架来构建我们的分布式系统,在服务端进行用户管理都是非常重要的一个环节.然而用户管理是否应该隶属于通信框架了?这个并不一定,通常来说,用户管理是与具体应用紧密相关的,应该是由应用解 ...
- 正规消息发送器-- ESFramework 4.0 进阶(06)
在ESFramework 4.0 进阶(04)-- 驱动力:通信引擎(下)一文末尾我们已经将通信引擎以及整个消息骨架流程组装起来了,只要通信引擎一接收到消息,框架就会按照规定的流程进行运转.到这里,自 ...
- 消息同步调用-- ESFramework 4.0 进阶(07)
分布式系统的构建一般有两种模式,一是基于消息(如Tcp,http等),一是基于方法调用(如RPC.WebService.Remoting).深入想一想,它们其实是一回事.如果你了解过.NET的Prox ...
- 挂接P2P通道-- ESFramework 4.0 进阶(08)
最新版本的ESFramework/ESPlus提供了基于TCP和UDP的P2P通道,而无论我们是使用基于TCP的P2P通道,还是使用基于UDP的P2P通道,ESPlus保证所有的P2P通信都是可靠的. ...
- 核心梳理——消息处理的骨架流程——ESFramework 4.0 进阶(02)
在ESFramework 4.0 概述一文中,我们提到ESFramework.dll作为通信框架的核心,定义了消息处理的骨架流程,本文我们来详细剖析这个流程以及该骨架中所涉及的各个组件.ESFrame ...
- 好友与组--ESFramework 4.0 进阶(11)
大部分分布式通信系统中,都会涉及到客户端之间相互通信.以及需要将客户端进行分组的功能,或者是类似这方面的需求.ESFramework对这一常见的任务内置了强大的支持,包括从客户端到服务端.一直到Pla ...
- ESFramework 4.0 进阶(01)-- 消息
需要交互的分布式系统之间通过消息来传递有意义的信息.消息是通信框架的核心.离开了消息,再谈通信框架就没有任何意义,所以,消息是ESFramework中一个最核心的概念. 一. 消息的类别 在具体的应用 ...
随机推荐
- Openjudge-NOI题库-数根
题目描述 Description 数根可以通过把一个数的各个位上的数字加起来得到.如果得到的数是一位数,那么这个数就是数根.如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来.如此进行下去, ...
- MQTT协议之 Apache Apollo服务
一.说明 MQTT是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网) ...
- OllyDBG V1.10聆风听雨汉化版
软件名称:OllyDBG V1.10聆风听雨汉化版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 3.84MB 图片预览: 软件简介: Ollydbg2. ...
- 可参考的gulp资源
可参考的gulp资源 入门:https://segmentfault.com/a/1190000000435599 比较详细:https://markpop.github.io/2014/09/17/ ...
- webp图片详解
WebP(发音 weppy),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使 ...
- jquery+ajax 实现text框模糊搜索并可利用listbox实时显示模糊搜索列表结果
功能描述: text框中输入,text框下面的listbox中实时显示依据输入的内容进行模糊搜索的结果 js代码 $j(function() { $j("input[id='txtCos'] ...
- Gulp安装使用教程
题记:为什么要使用gulp,网上有很多关于gulp的优势,而在我看来,这些都是工具的优势!工具的优势最主要体现在易用性上,听说gulp比grunt更易用,所以这里写个文档记录. 同样要保证nodejs ...
- kubernetes port nodePort targetPort 理解
port The port that the service is exposed on the service's cluster ip (virsual ip). Port is the serv ...
- mac上搭建python+selenium2的环境
1.mac默认已安装有python和easy_install 2.进入终端,使用root的权限,然后输入,回车后需要root的密码,即可安装成功,成功结果如下所示 sudo easy_install ...
- JavaScript DOM编程艺术-学习笔记(第二章)
1.好习惯从末尾加分号:开始 2.js区分大小写 3.程序界万能的命名法则:①不以,数字开头的数字.字母.下划线.美元符号 ②提倡以下划线命名法来命名变量,以驼峰命名法来命名函数.但是到了公司往往会身 ...