跳到主要内容
版本:2.1

创建Dmtp服务器

定义

命名空间:TouchSocket.Dmtp
程序集:TouchSocket.Dmtp.dll
程序集:TouchSocketPro.Dmtp.dll

一、说明

Dmtp的服务器有多种形式的host,每种服务器的创建都大同小异,且功能基本一致。

二、服务器架构

Dmtp服务器的架构与其所属的基础协议架构一致,例如,在基于tcp协议时,其架构就和tcp服务器一致。在收到新客户端连接时,会创建一个TcpDmtpSessionClient的类实例,与客户端TcpDmtpClient一一对应,后续的数据通信均由此实例负责。

三、可配置项

可配置项

SetDmtpOption

设置Dmtp相关配置。其中包含:

  • VerifyToken:设置验证口令。
  • VerifyTimeout:验证连接超时时间。仅用于服务器。意为:当服务器收到基础链接,在指定的时间内如果没有收到握手信息,则直接视为无效链接,直接断开。

四、支持插件接口

声明自定义插件类,实现IPlugin接口,或者继承PluginBase,然后实现所需插件接口,即可实现事务的触发。

插件方法功能
IDmtpHandshakingPlugin客户端在验证连接。默认情况下,框架会首先验证连接Token是否正确,如果不正确则直接拒绝。不会有任何投递。用户也可以使用Metadata进行动态验证。
IDmtpHandshakedPlugin客户端完成握手连接验证
IDmtpReceivedPlugin在收到Dmtp格式的数据包时触发
IDmtpRoutingPlugin当需要路由数据时触发,并且必须返回e.IsPermitOperation=true时,才允许路由
IDmtpCreatedChannelPlugin在收到创建通道的请求时候触发。
IDmtpClosingPlugin即将断开连接时触发(仅主动断开时、或收到了Close报文时有效)。
IDmtpClosedPlugin在Dmtp连接断开时触发。

五、创建服务器

5.1 TcpDmtpService

TcpDmtpService是基于Tcp协议的Dmtp。在可配置的基础之上,还可以配置与TcpService可配置项相关的配置。

var service = new TcpDmtpService();
var config = new TouchSocketConfig()//配置
.SetListenIPHosts(7789)
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
})
.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Dmtp"//设定连接口令,作用类似账号密码
});

await service.SetupAsync(config);

await service.StartAsync();

service.Logger.Info($"{service.GetType().Name}已启动");

5.2 UdpDmtp

UdpDmtp是基于Udp协议Dmtp。在可配置的基础之上,还可以配置与UdpSession可配置项相关的配置。

var udpDmtp = new UdpDmtp();

var config = new TouchSocketConfig();
config.SetBindIPHost(new IPHost(7789))
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
});

await udpDmtp.SetupAsync(config);

await udpDmtp.StartAsync();
备注

UdpDmtp作为服务器的时候,需要设定SetBindIPHost

5.3 HttpDmtpService

HttpDmtpService是基于Http升级协议。在该解析器中,配置设置HttpService一致。

var service = new HttpDmtpService();
var config = new TouchSocketConfig()//配置
.SetListenIPHosts(new IPHost[] { new IPHost(7789) })
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
})
.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Dmtp"
});

await service.SetupAsync(config);

await service.StartAsync();

service.Logger.Info($"{service.GetType().Name}已启动");

5.4 基于AspNetCore的Websocket协议

具体步骤

  1. nuget 安装TouchSocket.AspNetCore或者TouchSocketPro.AspNetCore
  2. IServiceCollection添加AddWebSocketDmtpService,并进行相关配置(不用配置端口,会和asp使用同一端口)。
  3. IApplicationBuilder必须先使用UseWebSockets
  4. IApplicationBuilder调用UseWebSocketDmtp,并传入url设置。

在Services时,添加AddWebSocketDmtpService,并且配置相关项。

//添加WebSocket协议的Dmtp
//客户端使用WebSocketDmtpClient
builder.Services.AddWebSocketDmtpService(config =>
{
config
.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Dmtp"
})
.ConfigurePlugins(a =>
{
//添加插件
a.Add<MyClassPlugin>();
});
});

启用中间件

首先必须先启用WebSocket。其次使用UseWebSocketDmtp即可。

var app = builder.Build();
app.UseWebSockets();
app.UseWebSocketDmtp("/WebSocketDmtp");//WebSocketDmtp必须在UseWebSockets之后使用。

5.5 基于AspNetCore的Http协议

具体步骤

  1. nuget 安装TouchSocketPro.AspNetCore
  2. IServiceCollection添加AddHttpMiddlewareDmtpService,并进行相关配置(不用配置端口,会和asp使用同一端口)。
  3. IApplicationBuilder调用UseHttpDmtp

在Services时,添加AddWebSocketDmtpService,并且配置相关项。

//Pro功能
//添加基于Http升级协议的Dmtp。
//客户端使用HttpDmtpClient
builder.Services.AddHttpMiddlewareDmtpService(config =>
{
config.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Dmtp"
})
.ConfigurePlugins(a =>
{
//添加插件
a.Add<MyClassPlugin>();
});
});

启用中间件

使用UseHttpDmtp即可。

var app = builder.Build();
app.UseHttpDmtp(); //HttpDmtp可以单独直接使用。不需要其他。
提示

在整个Apsnetcore的Host中,所有组件会共用一个容器。所以建议使用ConfigureContainer统一设置。

builder.Services.ConfigureContainer(container => 
{
container.AddConsoleLogger();
container.AddDmtpRouteService();
});

基于Aspnetcore的Dmtp示例Demo

5.6 基于NamedPipe协议

这是基于NamedPipe的Dmtp。在可配置的基础之上,还可以配置与NamedPipeService可配置项相关的配置。

var service = new NamedPipeDmtpService();
var config = new TouchSocketConfig()//配置
.SetPipeName("TouchSocketPipe")//设置管道名称
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
})
.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Dmtp"//设定连接口令,作用类似账号密码
});

await service.SetupAsync(config);

await service.StartAsync();

service.Logger.Info($"{service.GetType().Name}已启动");

基于NamedPipe的Dmtp示例Demo