mirror of
https://github.com/RRQM/TouchSocket.git
synced 2025-12-19 09:56:44 +08:00
文档:新增DmtpRpc部分课程链接
This commit is contained in:
@@ -3,6 +3,8 @@ id: dmtpbase
|
||||
title: Dmtp基础功能
|
||||
---
|
||||
|
||||
import BilibiliCard from '@site/src/components/BilibiliCard.js';
|
||||
|
||||
### 定义
|
||||
|
||||
命名空间:TouchSocket.Dmtp <br/>
|
||||
@@ -16,6 +18,8 @@ title: Dmtp基础功能
|
||||
|
||||
在服务器或客户端的配置上,设置`VerifyToken`,即可实现字符串`Token`验证。
|
||||
|
||||
<BilibiliCard title="使用Token、或动态验证连接" link="https://www.bilibili.com/cheese/play/ep1726372" isPro="true"/>
|
||||
|
||||
```csharp {4} showLineNumbers
|
||||
var config = new TouchSocketConfig()
|
||||
.SetDmtpOption(new DmtpOption()
|
||||
@@ -175,6 +179,7 @@ DMTP基础功能是比较容易跨语言的,但这并不意味着DMTP所有的
|
||||
|
||||
在Dmtp中,存在于服务器的辅助客户端(SessionClient),与远程客户端(Client)是一一对应关系,其Id也**完全一致**。所以在任意一方修改Id(调用ResetId),都会同时修改远程Id。所以合理使用该操作,可以完成复用Id(重置Id)的需求。
|
||||
|
||||
<BilibiliCard title="Dmtp预设Id和重置Id" link="https://www.bilibili.com/cheese/play/ep1726373" isPro="true"/>
|
||||
|
||||
## 三、发送数据
|
||||
|
||||
@@ -184,6 +189,10 @@ Dmtp提供协议发送数据,又叫协议扩展功能,就是对现有的Dmtp
|
||||
|
||||
第一个参数为`ushort`类型,使用者可以**约定任意大于20数值**。
|
||||
|
||||
<BilibiliCard title="使用Dmtp发送协议数据" link="https://www.bilibili.com/cheese/play/ep1726375" isPro="true"/>
|
||||
|
||||
<BilibiliCard title="使用Dmtp发送IPackage数据" link="https://www.bilibili.com/cheese/play/ep1726376" isPro="true"/>
|
||||
|
||||
```csharp showLineNumbers
|
||||
client.SendAsync(1000,Encoding.UTF8.GetBytes("RRQM"));
|
||||
```
|
||||
@@ -221,6 +230,10 @@ internal class MyFlagsPlugin : PluginBase, IDmtpReceivedPlugin
|
||||
|
||||
换言之,一个`DmtpActor`可以有**多个Channel**。多个`Channel`可以**同时进行传输**。并且数据互不干扰。
|
||||
|
||||
<BilibiliCard title="使用Channel发送数据" link="https://www.bilibili.com/cheese/play/ep1726377" isPro="true"/>
|
||||
|
||||
<BilibiliCard title="Dmtp路由转发Channel数据" link="https://www.bilibili.com/cheese/play/ep1726378" isPro="true"/>
|
||||
|
||||
### 4.1 特点
|
||||
|
||||
1. 每个`Channel`都有独立的Id,所以多个`Channel`可以同时工作。
|
||||
|
||||
@@ -5,6 +5,7 @@ title: 创建Dmtp客户端
|
||||
|
||||
import Tag from "@site/src/components/Tag.js";
|
||||
import Pro from "@site/src/components/Pro.js";
|
||||
import BilibiliCard from '@site/src/components/BilibiliCard.js';
|
||||
|
||||
### 定义
|
||||
|
||||
@@ -53,6 +54,8 @@ Dmtp客户端对应的,也有不同协议的版本。各个版本之间功能
|
||||
|
||||
`TcpDmtpClient`对应`TcpDmtpService`服务器。基本创建如下,支持[创建TcpClient](./tcpclient.mdx)的所有配置。
|
||||
|
||||
<BilibiliCard title="创建Tcp协议的Dmtp客户端" link="https://www.bilibili.com/cheese/play/ep1726347" isPro="true"/>
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new TcpDmtpClient();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
@@ -68,6 +71,8 @@ await client.ConnectAsync();
|
||||
|
||||
`UdpDmtp`对应`UdpDmtp`服务器,即`UdpDmtp`即是服务器,又是客户端。基本创建如下,支持[创建UdpSession](./udpsession.mdx)的所有配置。
|
||||
|
||||
<BilibiliCard title="创建Udp协议的Dmtp客户端" link="https://www.bilibili.com/cheese/play/ep1726349" isPro="true"/>
|
||||
|
||||
```csharp {1,4-6,11} showLineNumbers
|
||||
var client = new UdpDmtp();
|
||||
|
||||
@@ -97,6 +102,8 @@ var client = new UdpDmtp();
|
||||
|
||||
`HttpDmtpClient`对应`HttpDmtpService`,或者`HttpMiddlewareDmtpService`服务器。基本创建如下,支持[创建HttpClient](./httpclient.mdx)的所有配置。
|
||||
|
||||
<BilibiliCard title="创建Http协议的Dmtp客户端" link="https://www.bilibili.com/cheese/play/ep1726352" isPro="true"/>
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new HttpDmtpClient();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
@@ -110,6 +117,8 @@ await client.ConnectAsync();
|
||||
|
||||
### 4.4 WebSocketDmtpClient
|
||||
|
||||
<BilibiliCard title="创建WebSocket协议的Dmtp客户端" link="https://www.bilibili.com/cheese/play/ep1726355" isPro="true"/>
|
||||
|
||||
```csharp showLineNumbers
|
||||
var websocketDmtpClient = new WebSocketDmtpClient();
|
||||
websocketDmtpClient.Setup(new TouchSocketConfig()
|
||||
@@ -180,6 +189,8 @@ finally
|
||||
|
||||
`NamedPipeDmtpClient`对应`NamedPipeDmtpService`服务器。基本创建如下,支持[创建NamedPipeClient](./namedpipeclient.mdx)的所有配置。
|
||||
|
||||
<BilibiliCard title="创建NamedPipe协议的Dmtp客户端" link="https://www.bilibili.com/cheese/play/ep1726360" isPro="true"/>
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new NamedPipeDmtpClient();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
|
||||
@@ -3,6 +3,7 @@ id: dmtpdescription
|
||||
title: 产品及架构介绍
|
||||
---
|
||||
import Pro from "@site/src/components/Pro.js";
|
||||
import BilibiliCard from '@site/src/components/BilibiliCard.js';
|
||||
|
||||
### 定义
|
||||
|
||||
@@ -14,6 +15,8 @@ import Pro from "@site/src/components/Pro.js";
|
||||
|
||||
DMTP(Duplex Message Transport Protocol双工消息传输协议)是一个简单易用,便捷高效,且易于扩展的**二进制数据协议**。
|
||||
|
||||
<BilibiliCard title="Dmtp协议及应用场景详解" link="https://www.bilibili.com/cheese/play/ep1616806" isPro="true"/>
|
||||
|
||||
【协议格式】
|
||||
|
||||
|--Head--|--Flags--|--Length--|-----Data-----|
|
||||
|
||||
@@ -3,6 +3,8 @@ id: dmtprpc
|
||||
title: Rpc功能
|
||||
---
|
||||
|
||||
import BilibiliCard from '@site/src/components/BilibiliCard.js';
|
||||
|
||||
### 定义
|
||||
|
||||
命名空间:TouchSocket.Dmtp.Rpc <br/>
|
||||
@@ -22,6 +24,12 @@ RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从
|
||||
- 支持绝大多数数据类型及自定义实体类。
|
||||
- 支持自定义序列化。
|
||||
|
||||
<BilibiliCard title="DmtpRpc简单介绍" link="https://www.bilibili.com/cheese/play/ep1742128" isPro="true"/>
|
||||
|
||||
<BilibiliCard title="完成DmtpRpc的基本调用" link="https://www.bilibili.com/cheese/play/ep1742130" isPro="true"/>
|
||||
|
||||
<BilibiliCard title="DmtpRpc的调用原理" link="https://www.bilibili.com/cheese/play/ep1742131" isPro="true"/>
|
||||
|
||||
## 二、使用Rpc服务
|
||||
|
||||
### 2.1 定义服务
|
||||
@@ -144,6 +152,10 @@ bool result =client.GetDmtpRpcActor().InvokeT<bool>("Login", InvokeOption.WaitIn
|
||||
|
||||
代理调用的便捷在于,客户端不用再知道哪些服务可调,也不用再纠结调用的参数类型正不正确,因为这些,代理工具都会替你做好。
|
||||
|
||||
<BilibiliCard title="使用代理生成文件的方式调用DmtpRpc" link="https://www.bilibili.com/cheese/play/ep1742132" isPro="true"/>
|
||||
|
||||
<BilibiliCard title="使用源生成的方式调用DmtpRpc" link="https://www.bilibili.com/cheese/play/ep1742133" isPro="true"/>
|
||||
|
||||
详细步骤:
|
||||
|
||||
1. [生成代理文件](./rpcgenerateproxy.mdx)
|
||||
@@ -288,6 +300,9 @@ client.GetDmtpRpcActor()的操作,内部还需要执行字典的查询操作
|
||||
|
||||
一般的rpc服务都是客户端发起,服务器响应。但是有时候也需要服务器发起,客户端响应,所以需要反向rpc。
|
||||
|
||||
<BilibiliCard title="反向调用DmtpRpc" link="https://www.bilibili.com/cheese/play/ep1742134" isPro="true"/>
|
||||
<BilibiliCard title="使用源生成反向调用DmtpRpc" link="https://www.bilibili.com/cheese/play/ep1742135" isPro="true"/>
|
||||
|
||||
### 3.1 定义、发布反向Rpc服务
|
||||
|
||||
实际上,Dmtp的全称(Duplex Message Transport Protocol双工消息传输协议),Duplex意为双工,则表明,当Dmtp客户端连接到服务以后,拥有与服务器同等的通讯权限与功能。所以客户端发布Rpc服务的步骤和服务器完全一致。即:当客户端和服务器建立连接以后,就不再区分谁是客户端,谁是服务器了。只关心,**谁能提供服务,谁在调用服务**。
|
||||
@@ -402,6 +417,9 @@ partial class MyRpcServer : TransientRpcServer
|
||||
|
||||
除了Rpc,反向Rpc,DmtpRpc还支持**客户端**之间互Call Rpc。服务的定义与Rpc一样。
|
||||
|
||||
<BilibiliCard title="客户端互CallRpc" link="https://www.bilibili.com/cheese/play/ep1742136" isPro="true"/>
|
||||
<BilibiliCard title="使用源生成客户端互CallRpc" link="https://www.bilibili.com/cheese/play/ep1742137" isPro="true"/>
|
||||
|
||||
### 4.1 互Call RPC
|
||||
|
||||
客户端1调用客户端2的方法,需要知道对方的**Id**。然后和调用Rpc方法一致。然后使用下列函数调用即可。
|
||||
@@ -480,6 +498,8 @@ FeedbackType是调用反馈类型,其枚举值分别有OnlySend、WaitSend、W
|
||||
- `WaitSend`意为发送Rpc请求,并等待**接收**结果。即,返回时,仅表示对方收到了Rpc请求,但是具体执行如何,则不可知。这一般在不可靠协议中是有用的。
|
||||
- `WaitInvoke`意为发送Rpc请求,并等待**执行**结果。即,返回时,表示对方已经执行了Rpc请求,如果有执行返回值,则携带返回值。如果执行过程发生异常,则会将异常返回。
|
||||
|
||||
<BilibiliCard title="FeedbackType详解和性能对比测试" link="https://www.bilibili.com/cheese/play/ep1742138" isPro="true"/>
|
||||
|
||||
### 5.2 SerializationType
|
||||
|
||||
`SerializationType`是序列化类型,其枚举值有`FastBinary`、`Json`、`Xml`、`SystemBinary`。其特点如下:
|
||||
@@ -496,6 +516,14 @@ FeedbackType是调用反馈类型,其枚举值分别有OnlySend、WaitSend、W
|
||||
- JsonSerializerSettings:Json序列化设置属性
|
||||
- SerializationBinder:系统二进制序列化绑定器
|
||||
|
||||
<BilibiliCard title="DmtpRpc使用4种序列化的场景分析" link="https://www.bilibili.com/cheese/play/ep1742141" isPro="true"/>
|
||||
|
||||
<BilibiliCard title="配置默认序列化选择器和使用Fast序列化的源生成" link="https://www.bilibili.com/cheese/play/ep1742143" isPro="true"/>
|
||||
|
||||
<BilibiliCard title="在DmtpRpc种使用SystemTextJson源生成" link="https://www.bilibili.com/cheese/play/ep1742144" isPro="true"/>
|
||||
|
||||
<BilibiliCard title="自定义序列化并且使用MemoryPack实践" link="https://www.bilibili.com/cheese/play/ep1742145" isPro="true"/>
|
||||
|
||||
例如:
|
||||
|
||||
```csharp showLineNumbers
|
||||
@@ -749,6 +777,8 @@ var invokeOption = new DmtpInvokeOption()//调用配置
|
||||
|
||||
Timeout是超时时间,单位是毫秒。
|
||||
|
||||
<BilibiliCard title="DmtpRpc的超时设定和CancellationTok" link="https://www.bilibili.com/cheese/play/ep1742140" isPro="true"/>
|
||||
|
||||
### 5.4 CancellationToken
|
||||
|
||||
CancellationToken是取消令箭源,可用于取消Rpc的调用。
|
||||
@@ -780,6 +810,8 @@ client.Logger.Info($"调用Add方法成功,结果:{sum}");
|
||||
|
||||
Metadata是字符串键值对,其作用类似http的headers,用于传递一些附加信息。
|
||||
|
||||
<BilibiliCard title="使用Dmtp的Metadata传递自定义消息" link="https://www.bilibili.com/cheese/play/ep1742139" isPro="true"/>
|
||||
|
||||
在请求时可以通过DmtpInvokeOption进行传参。
|
||||
|
||||
```csharp {6} showLineNumbers
|
||||
@@ -808,6 +840,9 @@ public Metadata CallContextMetadata(IDmtpRpcCallContext callContext)
|
||||
|
||||
> **在Rpc中,并没有对传输的数据做限制,但是因为Rpc默认使用的固定包头适配器中,默认设置的可传递数据为10Mb,所以在Rpc中,用户可一次性传递的数据包大约为9.9Mb。所以,如果用户传递超出阈值的数据,适配器则会触发异常,而无法接收。但在实际上Rpc的使用中,大数据的传输也是很重要的一个环节,所以在此做了大数据的传输思路建议,希望能有效解决大家的麻烦。**
|
||||
|
||||
|
||||
<BilibiliCard title="DmtpRpc结合Channel发送和接受大数据包" link="https://www.bilibili.com/cheese/play/ep1742147" isPro="true"/>
|
||||
|
||||
<a name="DU9Pj"></a>
|
||||
|
||||
### 6.1 设置适配器参数(推荐指数:⭐)
|
||||
|
||||
@@ -5,6 +5,7 @@ title: 创建Dmtp服务器
|
||||
|
||||
import Tag from "@site/src/components/Tag.js";
|
||||
import Pro from "@site/src/components/Pro.js";
|
||||
import BilibiliCard from '@site/src/components/BilibiliCard.js';
|
||||
|
||||
### 定义
|
||||
|
||||
@@ -16,6 +17,7 @@ import Pro from "@site/src/components/Pro.js";
|
||||
|
||||
Dmtp的服务器有多种形式的host,每种服务器的创建都大同小异,且功能基本一致。
|
||||
|
||||
<BilibiliCard title="新创建Dmtp服务器项目" link="https://www.bilibili.com/cheese/play/ep1726345" isPro="true"/>
|
||||
|
||||
## 二、服务器架构
|
||||
|
||||
@@ -59,6 +61,8 @@ Dmtp服务器的架构与其所属的基础协议架构一致,例如,在基
|
||||
|
||||
`TcpDmtpService`是基于`Tcp`协议的Dmtp。在可配置的基础之上,还可以配置与[TcpService可配置项](./tcpservice.mdx)相关的配置。
|
||||
|
||||
<BilibiliCard title="创建Tcp协议的Dmtp服务器" link="https://www.bilibili.com/cheese/play/ep1726346" isPro="true"/>
|
||||
|
||||
```csharp showLineNumbers
|
||||
var service = new TcpDmtpService();
|
||||
var config = new TouchSocketConfig()//配置
|
||||
@@ -83,6 +87,8 @@ service.Logger.Info($"{service.GetType().Name}已启动");
|
||||
|
||||
`UdpDmtp`是基于`Udp`协议Dmtp。在可配置的基础之上,还可以配置与[UdpSession可配置项](./udpsession.mdx)相关的配置。
|
||||
|
||||
<BilibiliCard title="创建Udp协议的Dmtp服务器" link="https://www.bilibili.com/cheese/play/ep1726348" isPro="true"/>
|
||||
|
||||
```csharp showLineNumbers
|
||||
var udpDmtp = new UdpDmtp();
|
||||
|
||||
@@ -108,6 +114,8 @@ await udpDmtp.StartAsync();
|
||||
|
||||
`HttpDmtpService`是基于`Http`升级协议。在该解析器中,配置设置[HttpService](./httpservice.mdx)一致。
|
||||
|
||||
<BilibiliCard title="创建Http协议的Dmtp服务器" link="https://www.bilibili.com/cheese/play/ep1726350" isPro="true"/>
|
||||
|
||||
```csharp showLineNumbers
|
||||
var service = new HttpDmtpService();
|
||||
var config = new TouchSocketConfig()//配置
|
||||
@@ -137,6 +145,8 @@ service.Logger.Info($"{service.GetType().Name}已启动");
|
||||
3. `IApplicationBuilder`必须先使用`UseWebSockets`。
|
||||
4. `IApplicationBuilder`调用`UseWebSocketDmtp`,并传入url设置。
|
||||
|
||||
<BilibiliCard title="创建WebSocket协议的Dmtp服务器" link="https://www.bilibili.com/cheese/play/ep1726354" isPro="true"/>
|
||||
|
||||
在Services时,添加`AddWebSocketDmtpService`,并且配置相关项。
|
||||
|
||||
```csharp {3} showLineNumbers
|
||||
@@ -175,6 +185,8 @@ app.UseWebSocketDmtp("/WebSocketDmtp");//WebSocketDmtp必须在UseWebSockets之
|
||||
2. `IServiceCollection`添加`AddHttpMiddlewareDmtpService`,并进行相关配置(不用配置端口,会和asp使用同一端口)。
|
||||
3. `IApplicationBuilder`调用`UseHttpDmtp`。
|
||||
|
||||
<BilibiliCard title="创建基于AspNetCore的Http协议的Dmtp服务器" link="https://www.bilibili.com/cheese/play/ep1726353" isPro="true"/>
|
||||
|
||||
在Services时,添加`AddWebSocketDmtpService`,并且配置相关项。
|
||||
|
||||
```csharp showLineNumbers
|
||||
@@ -224,6 +236,8 @@ builder.Services.ConfigureContainer(container =>
|
||||
|
||||
这是基于`NamedPipe`的Dmtp。在可配置的基础之上,还可以配置与[NamedPipeService可配置项](./namedpipeservice.mdx)相关的配置。
|
||||
|
||||
<BilibiliCard title="创建NamedPipe协议的Dmtp服务器" link="https://www.bilibili.com/cheese/play/ep1726356" isPro="true"/>
|
||||
|
||||
```csharp showLineNumbers
|
||||
var service = new NamedPipeDmtpService();
|
||||
var config = new TouchSocketConfig()//配置
|
||||
|
||||
Reference in New Issue
Block a user