---
id: dmtpservice
title: 创建Dmtp服务器
---

import Tag from "@site/src/components/Tag.js";

### 定义

命名空间：TouchSocket.Dmtp <br/>
程序集：[TouchSocket.Dmtp.dll](https://www.nuget.org/packages/TouchSocket.Dmtp)<br/>
程序集：[TouchSocketPro.Dmtp.dll](https://www.nuget.org/packages/TouchSocketPro.Dmtp) <Tag>Pro</Tag>

## 一、说明

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


## 二、服务器架构

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


## 三、可配置项

<details>
<summary>可配置项</summary>
<div>

#### SetDmtpOption
设置Dmtp相关配置。其中包含：

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

</div>
</details>

## 四、支持插件接口

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

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


## 五、创建服务器


### 5.1 TcpDmtpService

`TcpDmtpService`是基于`Tcp`协议的Dmtp。在可配置的基础之上，还可以配置与[TcpService可配置项](./tcpservice.mdx)相关的配置。

```csharp showLineNumbers
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可配置项](./udpsession.mdx)相关的配置。

```csharp showLineNumbers
var udpDmtp = new UdpDmtp();

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

await udpDmtp.SetupAsync(config);

await udpDmtp.StartAsync();
```

:::info 备注

`UdpDmtp`作为服务器的时候，需要设定`SetBindIPHost`。

:::  

### 5.3 HttpDmtpService

`HttpDmtpService`是基于`Http`升级协议。在该解析器中，配置设置[HttpService](./httpservice.mdx)一致。

```csharp showLineNumbers
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`，并且配置相关项。

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

启用中间件

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

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

### 5.5 基于AspNetCore的Http协议 <Tag>Pro</Tag>

具体步骤

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

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

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

启用中间件

使用`UseHttpDmtp`即可。

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

:::tip 提示

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

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

:::  

[基于Aspnetcore的Dmtp示例Demo](https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/Dmtp/DmtpWebApplication)

### 5.6 基于NamedPipe协议 <Tag>Pro</Tag>

这是基于`NamedPipe`的Dmtp。在可配置的基础之上，还可以配置与[NamedPipeService可配置项](./namedpipeservice.mdx)相关的配置。

```csharp showLineNumbers
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](https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/Dmtp/NamedPipeDmtpConsoleApp)