创建DmtpService
定义
定义
一、说明
DmtpService是基于Dmtp协议的服务器基类,它不参与实际的数据交互,只是配置、激活、管理、注销、重建SessionClient类实例。而SessionClient是当DmtpClient(客户端)成功连接服务器以后,由服务器新建的一个实例类,后续的所有通信,也都是通过该实例完成的。
Dmtp的服务器有多种形式的host,每种服务器的创建都大同小异,且功能基本一致。基于不同的底层协议(TCP、UDP、HTTP、WebSocket、NamedPipe),提供了统一的Dmtp协议接口。
二、特点
- 简单易用。
- 支持多种底层协议(TCP、UDP、HTTP、WebSocket、NamedPipe)。
- 统一的Dmtp协议接口,无论底层协议如何,上层API保持一致。
- 多线程。
- 内存池支持
- 高性能数据传输和RPC调用。
- 多地址监听(TCP协议时可以一次性监听多个IP及端口)
- 适配器预处理,一键式解决分包、粘包等问题。
- 超简单的同步发送、异步发送、接收等操作。
- 基于委托、插件驱动,让每一步都能执行AOP。
- 支持文件传输、RPC调用、远程访问等高级功能。
2.1 性能测试
Dmtp基于底层协议的性能表现,当使用TCP作为底层协议时,性能与TcpService基本一致。同时,Dmtp还提供了更多高级功能如RPC、文件传输等,在保证高性能的同时提供了更丰富的功能。
三、产品应用场景
- 需要高级通信功能的场景:RPC调用、文件传输、远程访问等。
- 跨协议统一接口需求:可以轻松在不同底层协议间切换而不改变上层代码。
- 企业级应用:支持认证、路由、通道管理等企业级功能。
- 微服务架构:提供高性能的服务间通信解决方案。
四、服务器架构
4.1 连接架构
Dmtp服务器的架构与其所属的基础协议架构一致,例如,在基于TCP协议时,其架构就和TCP服务器一致。服务器在收到新客户端连接时,会创建一个对应的SessionClient派生类实例(如TcpDmtpSessionClient),与客户端DmtpClient一一对应,后续的数据通信均由此实例负责。
SessionClient在Service里面以字典映射。ID为键,SessionClient本身为值。
4.2 Scoped 生命周期
DmtpService在支持Scoped的IOC容器中工作时,也是支持Scoped区域划分的。
一般情况下,DmtpService在Setup时,首先会创建一个Scoped区域,用于整个DmtpService的生命周期。在DmtpService释放(Dispose)时释放。
然后,当有新客户端连接后,会为每个SessionClient的派生类实例也创建一个Scoped区域,用于SessionClient的生命周期。当连接断开时,会释放此区域。
五、可配置项
5.1 Dmtp特有配置
SetDmtpOption
设置Dmtp相关配置。其中包含:
- VerifyToken:设置验证口令,作用类似账号密码。客户端连接时必须提供正确的Token才能建立连接。
- VerifyTimeout:验证连接超时时间。仅用于服务器。意为:当服务器收到基础链接,在指定的时间内如果没有收到握手信息,则直接视为无效链接,直接断开。
5.2 底层协议配置
根据不同的底层协议,DmtpService还可以配置相应协议的特有选项:
- 基于TCP时:支持TcpService可配置项的所有配置,如SSL、NoDelay、端口复用等。
- 基于UDP时:支持UdpSession可配置项的所有配置。
- 基于HTTP时:支持HttpService可配置项的所有配置。
- 基于NamedPipe时:支持NamedPipeService可配置项的所有配置。
六、支持插件接口
声明自定义插件类,实现IPlugin接口,或者继承PluginBase,然后实现所需插件接口,即可实现事务的触发。
| 插件方法 | 功能 |
|---|---|
| IDmtpConnectingPlugin | 客户端在验证连接。默认情况下,框架会首先验证连接Token是否正确,如果不正确则直接拒绝。不会有任何投递。用户也可以使用Metadata进行动态验证。 |
| IDmtpConnectedPlugin | 客户端完成握手连接验证 |
| IDmtpReceivedPlugin | 在收到Dmtp格式的数据包时触发 |
| IDmtpRoutingPlugin | 当需要路由数据时触发,并且必须返回e.IsPermitOperation=true时,才允许路由 |
| IDmtpCreatedChannelPlugin | 在收到创建通道的请求时候触发。 |
| IDmtpClosingPlugin | 即将断开连接时触发(仅主动断开时、或收到了Close报文时有效)。 |
| IDmtpClosedPlugin | 在Dmtp连接断开时触发。 |
七、创建服务器
DmtpService的创建,主要是根据不同的底层协议,创建不同的DmtpService派生类实例。
7.1 TcpDmtpService
TcpDmtpService是基于Tcp协议的Dmtp。在可配置的基础之上,还可以配置与TcpService可配置项相关的配置。
7.2 UdpDmtp
UdpDmtp是基于Udp协议Dmtp。在可配置的基础之上,还可以配置与UdpSession可配置项相关的配置。
UdpDmtp作为服务器的时候,需要设定SetBindIPHost。
7.3 HttpDmtpService
HttpDmtpService是基于Http升级协议。在该解析器中,配置设置HttpService一致。
7.4 基于AspNetCore的Websocket协议
具体步骤
- nuget 安装
TouchSocket.AspNetCore或者TouchSocketPro.AspNetCore。 IServiceCollection添加AddWebSocketDmtpService,并进行相关配置(不用配置端口,会和asp使用同一端口)。IApplicationBuilder必须先使用UseWebSockets。IApplicationBuilder调用UseWebSocketDmtp,并传入url设置。
7.5 基于AspNetCore的Http协议
具体步骤
- nuget 安装
TouchSocketPro.AspNetCore。 IServiceCollection添加AddHttpMiddlewareDmtpService,并进行相关配置(不用配置端口,会和asp使用同一端口)。IApplicationBuilder调用UseHttpDmtp。
在整个Apsnetcore的Host中,所有组件会共用一个容器。所以建议使用ConfigureContainer统一设置。
7.6 基于NamedPipe协议
这是基于NamedPipe的Dmtp。在可配置的基础之上,还可以配置与NamedPipeService可配置项相关的配置。