创建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协议
具体步骤
- nuget 安装
TouchSocket.AspNetCore
或者TouchSocketPro.AspNetCore
。 IServiceCollection
添加AddWebSocketDmtpService
,并进行相关配置(不用配置端口,会和asp使用同一端口)。IApplicationBuilder
必须先使用UseWebSockets
。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协议
具体步骤
- nuget 安装
TouchSocketPro.AspNetCore
。 IServiceCollection
添加AddHttpMiddlewareDmtpService
,并进行相关配置(不用配置端口,会和asp使用同一端口)。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();
});
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}已启动");