mirror of
https://github.com/RRQM/TouchSocket.git
synced 2025-12-19 18:06:45 +08:00
更新文档
This commit is contained in:
@@ -97,10 +97,10 @@ service.Received = (client, e) =>
|
||||
|
||||
};
|
||||
|
||||
service.Setup(new TouchSocketConfig()//载入配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//载入配置
|
||||
.SetListenIPHosts(new IPHost[] { new IPHost(7790) })
|
||||
.SetDataHandlingAdapter(() => { return new MyBigFixedHeaderCustomDataHandlingAdapter(); }));//配置适配器
|
||||
service.Start();//启动
|
||||
await service.StartAsync();//启动
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -128,11 +128,11 @@ service.Received = (client, e) =>
|
||||
return EasyTask.CompletedTask;
|
||||
};
|
||||
|
||||
service.Setup(new TouchSocketConfig()//载入配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//载入配置
|
||||
.SetListenIPHosts(new IPHost[] { new IPHost(7790) })
|
||||
.SetTcpDataHandlingAdapter(() => { return new MyCustomUnfixedHeaderDataHandlingAdapter(); }));//配置适配器
|
||||
|
||||
service.Start();//启动
|
||||
await service.StartAsync();//启动
|
||||
```
|
||||
|
||||
:::tip 提示
|
||||
|
||||
@@ -271,8 +271,8 @@ private static TcpDmtpService GetTcpDmtpService()
|
||||
VerifyToken = "Channel"//连接验证口令。
|
||||
});
|
||||
|
||||
service.Setup(config);
|
||||
service.Start();
|
||||
await service.SetupAsync(config);
|
||||
await service.StartAsync();
|
||||
service.Logger.Info("服务器成功启动");
|
||||
return service;
|
||||
}
|
||||
|
||||
@@ -57,13 +57,13 @@ Dmtp客户端对应的,也有不同协议的版本。各个版本之间功能
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new TcpDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7789")
|
||||
.SetDmtpOption(new DmtpOption()
|
||||
{
|
||||
VerifyToken = "Dmtp"
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
### 4.2 UdpDmtp
|
||||
@@ -73,7 +73,7 @@ client.Connect();
|
||||
```csharp {1,4-6,11} showLineNumbers
|
||||
var client = new UdpDmtp();
|
||||
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7797")
|
||||
.UseUdpReceive()
|
||||
.SetDmtpOption(new DmtpOption()
|
||||
@@ -101,13 +101,13 @@ var client = new UdpDmtp();
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new HttpDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7789")
|
||||
.SetDmtpOption(new DmtpOption()
|
||||
{
|
||||
VerifyToken = "Dmtp"
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
### 4.4 WebSocketDmtpClient
|
||||
@@ -184,13 +184,13 @@ finally
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new NamedPipeDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetPipeName("TouchSocketPipe")//设置管道名称
|
||||
.SetDmtpOption(new DmtpOption()
|
||||
{
|
||||
VerifyToken = "Dmtp"
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
[基于NamedPipe的Dmtp示例Demo](https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/Dmtp/NamedPipeDmtpConsoleApp)
|
||||
@@ -464,8 +464,8 @@ private static TcpDmtpService GetTcpDmtpService()
|
||||
VerifyToken = "Dmtp"//连接验证口令。
|
||||
});
|
||||
|
||||
service.Setup(config);
|
||||
service.Start();
|
||||
await service.SetupAsync(config);
|
||||
await service.StartAsync();
|
||||
service.Logger.Info("服务器成功启动");
|
||||
return service;
|
||||
}
|
||||
|
||||
@@ -97,9 +97,9 @@ var config = new TouchSocketConfig()//配置
|
||||
VerifyToken = "Rpc"//连接验证口令。
|
||||
});
|
||||
|
||||
service.Setup(config);
|
||||
await service.SetupAsync(config);
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info($"{service.GetType().Name}已启动");
|
||||
```
|
||||
@@ -114,7 +114,7 @@ service.Logger.Info($"{service.GetType().Name}已启动");
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new TcpDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7789")
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
@@ -124,7 +124,7 @@ client.Setup(new TouchSocketConfig()
|
||||
{
|
||||
VerifyToken = "Rpc"//连接验证口令。
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
bool result =(bool) client.GetDmtpRpcActor().Invoke(typeof(bool),"Login", InvokeOption.WaitInvoke, "123", "abc");
|
||||
```
|
||||
@@ -255,7 +255,7 @@ namespace RpcProxy
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new TcpDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7789")
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
@@ -265,7 +265,7 @@ client.Setup(new TouchSocketConfig()
|
||||
{
|
||||
VerifyToken = "Rpc"//连接验证口令。
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
bool result = client.GetDmtpRpcActor().Login("123", "abc", InvokeOption.WaitInvoke);//Login是生成的代理扩展方法。可能需要额外添加命名空间。
|
||||
```
|
||||
@@ -306,7 +306,7 @@ public partial class ReverseCallbackServer : RpcServer
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new TcpDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
@@ -327,7 +327,7 @@ client.Setup(new TouchSocketConfig()
|
||||
{
|
||||
VerifyToken = "Rpc"//连接验证口令。
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
client.Logger.Info($"连接成功,Id={client.Id}");
|
||||
```
|
||||
|
||||
@@ -572,7 +572,7 @@ public class MySerializationSelector : SerializationSelector
|
||||
|
||||
```csharp {10}
|
||||
var client = new TcpDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
@@ -591,7 +591,7 @@ client.Setup(new TouchSocketConfig()
|
||||
{
|
||||
VerifyToken = "Rpc"//连接验证口令。
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
:::caution 注意
|
||||
@@ -856,7 +856,7 @@ class MyDmtpRpcActor : DmtpRpcActor, IRpcClient1, IRpcClient2
|
||||
|
||||
```csharp {6}
|
||||
var client = new TcpDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
a.UseDmtpRpc()
|
||||
@@ -867,7 +867,7 @@ client.Setup(new TouchSocketConfig()
|
||||
{
|
||||
VerifyToken = "Rpc"//连接验证口令。
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
最后在获得RpcActor时,就可以按接口获取。然后配合服务器代码接口约束,就可以实现我们所期望的功能。
|
||||
|
||||
@@ -74,9 +74,9 @@ var config = new TouchSocketConfig()//配置
|
||||
VerifyToken = "Dmtp"//设定连接口令,作用类似账号密码
|
||||
});
|
||||
|
||||
service.Setup(config);
|
||||
await service.SetupAsync(config);
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info($"{service.GetType().Name}已启动");
|
||||
```
|
||||
@@ -124,9 +124,9 @@ var config = new TouchSocketConfig()//配置
|
||||
VerifyToken = "Dmtp"
|
||||
});
|
||||
|
||||
service.Setup(config);
|
||||
await service.SetupAsync(config);
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info($"{service.GetType().Name}已启动");
|
||||
```
|
||||
@@ -240,9 +240,9 @@ var config = new TouchSocketConfig()//配置
|
||||
VerifyToken = "Dmtp"//设定连接口令,作用类似账号密码
|
||||
});
|
||||
|
||||
service.Setup(config);
|
||||
await service.SetupAsync(config);
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info($"{service.GetType().Name}已启动");
|
||||
```
|
||||
|
||||
@@ -98,9 +98,9 @@ var config = new TouchSocketConfig()//配置
|
||||
{
|
||||
VerifyToken = "Rpc"//连接验证口令。
|
||||
});
|
||||
service.Setup(config);
|
||||
await service.SetupAsync(config);
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info($"{service.GetType().Name}已启动");
|
||||
```
|
||||
@@ -111,13 +111,13 @@ service.Logger.Info($"{service.GetType().Name}已启动");
|
||||
|
||||
```csharp {8}
|
||||
TcpTouchRpcClient client = new TcpTouchRpcClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7789")
|
||||
.SetDmtpOption(new DmtpOption()
|
||||
{
|
||||
VerifyToken = "Rpc"//连接验证口令。
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
//Loging即为在RpcClassLibrary中自动生成的项目
|
||||
var response = client.Login(new RpcClassLibrary.Models.LoginRequest() { Account= "Account",Password= "Account" });
|
||||
|
||||
@@ -24,9 +24,9 @@ config.SetListenIPHosts(new IPHost[] { new IPHost(7789) })
|
||||
|
||||
});
|
||||
|
||||
service.Setup(config);
|
||||
await service.SetupAsync(config);
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
Console.WriteLine("Http服务器已启动");
|
||||
```
|
||||
|
||||
@@ -110,7 +110,7 @@ JsonRpc支持多个基本协议的服务器,所以下面将一一介绍。
|
||||
|
||||
```csharp showLineNumbers
|
||||
var service = new TcpService();
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
.SetListenIPHosts(7705)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -129,7 +129,7 @@ service.Setup(new TouchSocketConfig()
|
||||
a.UseTcpJsonRpc();
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
```
|
||||
|
||||
:::caution 注意
|
||||
@@ -146,7 +146,7 @@ service.Start();
|
||||
```csharp showLineNumbers
|
||||
var service = new HttpService();
|
||||
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
.SetListenIPHosts(7706)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -161,7 +161,7 @@ service.Setup(new TouchSocketConfig()
|
||||
.SetJsonRpcUrl("/jsonRpc");
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
```
|
||||
|
||||
### 4.3 使用WebSocket协议服务器
|
||||
@@ -171,7 +171,7 @@ service.Start();
|
||||
```csharp showLineNumbers
|
||||
var service = new HttpService();
|
||||
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
.SetListenIPHosts(7707)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -194,7 +194,7 @@ service.Setup(new TouchSocketConfig()
|
||||
});
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
```
|
||||
|
||||
:::tip 提示
|
||||
@@ -241,34 +241,34 @@ service.Start();
|
||||
### 6.1 Tcp协议
|
||||
|
||||
```csharp showLineNumbers
|
||||
var jsonRpcClient = new TcpJsonRpcClient();
|
||||
jsonRpcClient.Setup(new TouchSocketConfig()
|
||||
var client = new TcpJsonRpcClient();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7705"));
|
||||
jsonRpcClient.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
string result = jsonRpcClient.InvokeT<string>("TestJsonRpc", InvokeOption.WaitInvoke, "RRQM");
|
||||
string result = client.InvokeT<string>("TestJsonRpc", InvokeOption.WaitInvoke, "RRQM");
|
||||
```
|
||||
|
||||
### 6.2 Http协议
|
||||
|
||||
```csharp showLineNumbers
|
||||
var jsonRpcClient = new HttpJsonRpcClient();
|
||||
jsonRpcClient.Setup(new TouchSocketConfig()
|
||||
var client = new HttpJsonRpcClient();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("http://127.0.0.1:7706/jsonrpc"));
|
||||
jsonRpcClient.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
string result = jsonRpcClient.InvokeT<string>("TestJsonRpc", InvokeOption.WaitInvoke, "RRQM");
|
||||
string result = client.InvokeT<string>("TestJsonRpc", InvokeOption.WaitInvoke, "RRQM");
|
||||
```
|
||||
|
||||
### 6.3 Websocket协议
|
||||
|
||||
```csharp showLineNumbers
|
||||
var jsonRpcClient = new WebSocketJsonRpcClient();
|
||||
jsonRpcClient.Setup(new TouchSocketConfig()
|
||||
var client = new WebSocketJsonRpcClient();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7707/ws"));//此url就是能连接到websocket的路径。
|
||||
jsonRpcClient.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
string result = jsonRpcClient.InvokeT<string>("TestJsonRpc", InvokeOption.WaitInvoke, "RRQM");
|
||||
string result = client.InvokeT<string>("TestJsonRpc", InvokeOption.WaitInvoke, "RRQM");
|
||||
```
|
||||
|
||||
### 6.4 生成代理调用
|
||||
@@ -304,28 +304,27 @@ var sum3 = client.TestJsonRpc("RRQM");
|
||||
/// 新建一个类,继承JsonRpcDispatchProxy,亦或者RpcDispatchProxy基类。
|
||||
/// 然后实现抽象方法,主要是能获取到调用的IRpcClient派生接口。
|
||||
/// </summary>
|
||||
class MyJsonRpcDispatchProxy : JsonRpcDispatchProxy
|
||||
internal class MyJsonRpcDispatchProxy : JsonRpcDispatchProxy
|
||||
{
|
||||
private readonly IJsonRpcClient m_client;
|
||||
|
||||
public MyJsonRpcDispatchProxy()
|
||||
{
|
||||
this.m_client = CreateJsonRpcClientByTcp();
|
||||
this.m_client = CreateJsonRpcClientByTcp().GetFalseAwaitResult();
|
||||
}
|
||||
|
||||
public override IJsonRpcClient GetClient()
|
||||
{
|
||||
return this.m_client;
|
||||
}
|
||||
|
||||
private static IJsonRpcClient CreateJsonRpcClientByTcp()
|
||||
private static async Task<IJsonRpcClient> CreateJsonRpcClientByTcp()
|
||||
{
|
||||
var client = new TcpJsonRpcClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7705")
|
||||
.SetTcpDataHandlingAdapter(() => new TerminatorPackageAdapter("\r\n")));
|
||||
client.Connect();
|
||||
|
||||
Console.WriteLine("连接成功");
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7705")
|
||||
.SetTcpDataHandlingAdapter(() => new TerminatorPackageAdapter("\r\n")));
|
||||
await client.ConnectAsync();
|
||||
return client;
|
||||
}
|
||||
}
|
||||
@@ -380,8 +379,8 @@ public partial class ReverseJsonRpcServer : RpcServer
|
||||
然后在插件注册全局`RpcStore`。并注册服务。
|
||||
|
||||
```csharp showLineNumbers
|
||||
var jsonRpcClient = new WebSocketJsonRpcClient();
|
||||
jsonRpcClient.Setup(new TouchSocketConfig()
|
||||
var client = new WebSocketJsonRpcClient();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
a.UseGlobalRpcStore()
|
||||
@@ -391,7 +390,7 @@ jsonRpcClient.Setup(new TouchSocketConfig()
|
||||
});
|
||||
})
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7707/ws"));//此url就是能连接到websocket的路径。
|
||||
jsonRpcClient.Connect();
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
在服务器端中,拿到IHttpSessionClient对象。然后调用GetJsonRpcActionClient扩展方法获取到jsonRpcClient。然后调用Invoke等。
|
||||
@@ -406,9 +405,9 @@ class MyPluginClass : PluginBase, IWebSocketHandshakedPlugin<IHttpSessionClient>
|
||||
try
|
||||
{
|
||||
//获取JsonRpcActionClient,用于执行反向Rpc
|
||||
var jsonRpcClient = client.GetJsonRpcActionClient();
|
||||
var client = client.GetJsonRpcActionClient();
|
||||
|
||||
var result = await jsonRpcClient.InvokeTAsync<int>("Add", InvokeOption.WaitInvoke, 10, 20);
|
||||
var result = await client.InvokeTAsync<int>("Add", InvokeOption.WaitInvoke, 10, 20);
|
||||
Console.WriteLine(result);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -48,84 +48,60 @@ import Tag from "@site/src/components/Tag.js";
|
||||
#### 6.1 创建ModbusTcpMaster
|
||||
|
||||
```csharp showLineNumbers
|
||||
public IModbusTcpMaster GetMaster()
|
||||
{
|
||||
var master = new ModbusTcpMaster();
|
||||
|
||||
master.Connect("127.0.0.1:502");
|
||||
return master;
|
||||
}
|
||||
var client = new ModbusTcpMaster();
|
||||
await client.ConnectAsync("127.0.0.1:502");
|
||||
```
|
||||
|
||||
#### 6.2 创建ModbusUdpMaster
|
||||
|
||||
```csharp showLineNumbers
|
||||
public IModbusMaster GetMaster()
|
||||
{
|
||||
var master = new ModbusUdpMaster();
|
||||
master.Setup(new TouchSocketConfig()
|
||||
.UseUdpReceive()
|
||||
.SetRemoteIPHost("127.0.0.1:502"));
|
||||
master.Start();
|
||||
return master;
|
||||
}
|
||||
var client = new ModbusUdpMaster();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.UseUdpReceive()
|
||||
.SetRemoteIPHost("127.0.0.1:502"));
|
||||
await client.StartAsync();
|
||||
```
|
||||
|
||||
#### 6.3 创建ModbusRtuMaster
|
||||
|
||||
```csharp showLineNumbers
|
||||
public IModbusMaster GetMaster()
|
||||
{
|
||||
var master = new ModbusRtuMaster();
|
||||
master.Setup(new TouchSocketConfig()
|
||||
.SetSerialPortOption(new SerialPortOption()
|
||||
{
|
||||
BaudRate = 9600,
|
||||
DataBits = 8,
|
||||
Parity = System.IO.Ports.Parity.Even,
|
||||
PortName = "COM2",
|
||||
StopBits = System.IO.Ports.StopBits.One
|
||||
}));
|
||||
master.Connect();
|
||||
return master;
|
||||
}
|
||||
var client = new ModbusRtuMaster();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetSerialPortOption(new SerialPortOption()
|
||||
{
|
||||
BaudRate = 9600,
|
||||
DataBits = 8,
|
||||
Parity = System.IO.Ports.Parity.Even,
|
||||
PortName = "COM2",
|
||||
StopBits = System.IO.Ports.StopBits.One
|
||||
}));
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
#### 6.4 创建ModbusRtuOverTcpMaster
|
||||
|
||||
```csharp showLineNumbers
|
||||
public IModbusMaster GetMaster()
|
||||
{
|
||||
var master = new ModbusRtuOverTcpMaster();
|
||||
master.Connect("127.0.0.1:502");
|
||||
return master;
|
||||
}
|
||||
var client = new ModbusRtuOverTcpMaster();
|
||||
await client.ConnectAsync("127.0.0.1:502");
|
||||
```
|
||||
|
||||
#### 6.5 创建ModbusRtuOverUdpMaster
|
||||
|
||||
```csharp showLineNumbers
|
||||
public IModbusMaster GetMaster()
|
||||
{
|
||||
var master = new ModbusRtuOverUdpMaster();
|
||||
master.Setup(new TouchSocketConfig()
|
||||
.UseUdpReceive()
|
||||
.SetRemoteIPHost("127.0.0.1:502"));
|
||||
master.Start();
|
||||
return master;
|
||||
}
|
||||
var client = new ModbusRtuOverUdpMaster();
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.UseUdpReceive()
|
||||
.SetRemoteIPHost("127.0.0.1:502"));
|
||||
await client.StartAsync();
|
||||
```
|
||||
|
||||
## 七、读写操作
|
||||
|
||||
### 7.1 原生接口操作
|
||||
|
||||
所有的Modbus主站都支持以下两种原生接口操作:
|
||||
所有的`Modbus`主站都支持以下原生接口操作:
|
||||
|
||||
```csharp showLineNumbers
|
||||
//同步发送Modbus请求,并等待响应
|
||||
IModbusResponse SendModbusRequest(ModbusRequest request, int millisecondsTimeout, CancellationToken token);
|
||||
|
||||
//异步发送Modbus请求,并等待响应
|
||||
Task<IModbusResponse> SendModbusRequestAsync(ModbusRequest request, int millisecondsTimeout, CancellationToken token);
|
||||
```
|
||||
@@ -139,7 +115,7 @@ modbusRequest.SetStartingAddress(0);//设置起始
|
||||
modbusRequest.SetQuantity(1);//设置数量
|
||||
//modbusRequest.SetValue(false);//如果是写入类操作,可以直接设定值
|
||||
|
||||
var response = master.SendModbusRequest(modbusRequest, 1000, CancellationToken.None);
|
||||
var response =await master.SendModbusRequestAsync(modbusRequest, 1000, CancellationToken.None);
|
||||
|
||||
bool[] bools = response.CreateReader().ToBoolensFromBit().ToArray();
|
||||
```
|
||||
@@ -151,19 +127,19 @@ bool[] bools = response.CreateReader().ToBoolensFromBit().ToArray();
|
||||
读取线圈(FC1)。
|
||||
|
||||
```csharp showLineNumbers
|
||||
bool[] bools = master.ReadCoils(0, 1);
|
||||
bool[] bools =await master.ReadCoilsAsync(0, 1);
|
||||
```
|
||||
|
||||
读取离散输入(FC2)。
|
||||
|
||||
```csharp showLineNumbers
|
||||
bool[] bools = master.ReadDiscreteInputs(0, 1);
|
||||
bool[] bools =await master.ReadDiscreteInputsAsync(0, 1);
|
||||
```
|
||||
|
||||
读取保持寄存器(FC3)。
|
||||
|
||||
```csharp showLineNumbers
|
||||
var response = master.ReadHoldingRegisters(0, 1);
|
||||
var response =await master.ReadHoldingRegistersAsync(0, 1);
|
||||
var reader = response.CreateReader();
|
||||
var value=reader.ReadInt16();
|
||||
```
|
||||
@@ -171,7 +147,7 @@ var value=reader.ReadInt16();
|
||||
读取输入寄存器(FC4)。
|
||||
|
||||
```csharp showLineNumbers
|
||||
var response = master.ReadInputRegisters(0, 1);
|
||||
var response =await master.ReadInputRegistersAsync(0, 1);
|
||||
var reader = response.CreateReader();
|
||||
var value=reader.ReadInt16();
|
||||
```
|
||||
@@ -179,19 +155,19 @@ var value=reader.ReadInt16();
|
||||
写入单个线圈(FC5)。
|
||||
|
||||
```csharp showLineNumbers
|
||||
master.WriteSingleCoil(0, true);
|
||||
await master.WriteSingleCoilAsync(0, true);
|
||||
```
|
||||
|
||||
写入单个寄存器(FC6)。
|
||||
|
||||
```csharp showLineNumbers
|
||||
master.WriteSingleRegister(0, (short)100);
|
||||
await master.WriteSingleRegisterAsync(0, (short)100);
|
||||
```
|
||||
|
||||
写入多个线圈(FC15)。
|
||||
|
||||
```csharp showLineNumbers
|
||||
master.WriteMultipleCoils(0, new bool[] { true, false, true });
|
||||
await master.WriteMultipleCoilsAsync(0, new bool[] { true, false, true });
|
||||
```
|
||||
|
||||
写入多个寄存器(FC16)。
|
||||
@@ -204,7 +180,7 @@ using (var writer = new ValueByteBlock(1024))
|
||||
writer.Write(long.MaxValue, EndianType.BigSwap);//BADC端序 8字节
|
||||
writer.Write(double.MaxValue, EndianType.LittleSwap);//CDAB端序 8字节
|
||||
|
||||
master.WriteMultipleRegisters(0, writer.ToArray());
|
||||
await master.WriteMultipleRegistersAsync(0, writer.ToArray());
|
||||
}
|
||||
```
|
||||
|
||||
@@ -223,7 +199,7 @@ using (var writer = new ValueByteBlock(1024))
|
||||
|
||||
```csharp showLineNumbers
|
||||
//读取寄存器
|
||||
var response = master.ReadHoldingRegisters(1, 0, 10);//站点1,从0开始读取10个寄存器
|
||||
var response =await master.ReadHoldingRegistersAsync(1, 0, 10);//站点1,从0开始读取10个寄存器
|
||||
|
||||
//创建一个读取器
|
||||
var reader = response.CreateReader();
|
||||
@@ -251,7 +227,7 @@ using (var valueByteBlock = new ValueByteBlock(1024))
|
||||
valueByteBlock.Write(long.MaxValue, EndianType.LittleSwap);//CDAB端序
|
||||
|
||||
//写入到寄存器
|
||||
master.WriteMultipleRegisters(1, 0, valueByteBlock.ToArray());
|
||||
await master.WriteMultipleRegistersAsync(1, 0, valueByteBlock.ToArray());
|
||||
}
|
||||
```
|
||||
|
||||
@@ -259,7 +235,7 @@ using (var valueByteBlock = new ValueByteBlock(1024))
|
||||
|
||||
```csharp showLineNumbers
|
||||
//读取寄存器
|
||||
var response = master.ReadHoldingRegisters(1, 0, 1 + 1 + 2 + 4);
|
||||
var response =await master.ReadHoldingRegistersAsync(1, 0, 1 + 1 + 2 + 4);
|
||||
|
||||
//创建一个读取器
|
||||
var reader = response.CreateReader();
|
||||
@@ -280,11 +256,11 @@ using (var valueByteBlock = new ValueByteBlock(1024))
|
||||
valueByteBlock.Write("Hello");
|
||||
|
||||
//写入到寄存器
|
||||
master.WriteMultipleRegisters(1, 0, valueByteBlock.ToArray());
|
||||
await master.WriteMultipleRegistersAsync(1, 0, valueByteBlock.ToArray());
|
||||
}
|
||||
|
||||
//读取寄存器
|
||||
var response = master.ReadHoldingRegisters(1, 0, 5);//5个长度,10字节
|
||||
var response =await master.ReadHoldingRegistersAsync(1, 0, 5);//5个长度,10字节
|
||||
|
||||
//创建一个读取器
|
||||
var reader = response.CreateReader();
|
||||
@@ -300,11 +276,11 @@ using (var valueByteBlock = new ValueByteBlock(1024))
|
||||
valueByteBlock.WriteObject(new MyClass() { P1 = 1, P2 = 2 }, SerializationType.Json);
|
||||
|
||||
//写入到寄存器
|
||||
master.WriteMultipleRegisters(1, 0, valueByteBlock.ToArray());
|
||||
await master.WriteMultipleRegistersAsync(1, 0, valueByteBlock.ToArray());
|
||||
}
|
||||
|
||||
//读取寄存器
|
||||
var response = master.ReadHoldingRegisters(1, 0, 10);//无法确定长度的话,可以估算一下,尽可能大即可
|
||||
var response =await master.ReadHoldingRegistersAsync(1, 0, 10);//无法确定长度的话,可以估算一下,尽可能大即可
|
||||
|
||||
//创建一个读取器
|
||||
var reader = response.CreateReader();
|
||||
|
||||
@@ -49,7 +49,7 @@ Modbus是主从通讯的。所以我们开发了Modbus服务器组件,方便
|
||||
static ModbusTcpSlave CreateModbusTcpSlave()
|
||||
{
|
||||
var service = new ModbusTcpSlave();
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
//监听端口
|
||||
.SetListenIPHosts(7808)
|
||||
.ConfigurePlugins(a =>
|
||||
@@ -60,7 +60,7 @@ static ModbusTcpSlave CreateModbusTcpSlave()
|
||||
.SetModbusDataLocater(new ModbusDataLocater(10,10,10,10));//设置数据区
|
||||
})
|
||||
);
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
Console.WriteLine("服务已启动");
|
||||
return service;
|
||||
}
|
||||
@@ -72,7 +72,7 @@ static ModbusTcpSlave CreateModbusTcpSlave()
|
||||
static ModbusUdpSlave CreateModbusUdpSlave()
|
||||
{
|
||||
var service = new ModbusUdpSlave();
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
//监听端口
|
||||
.SetBindIPHost(7809)
|
||||
.ConfigurePlugins(a =>
|
||||
@@ -83,7 +83,7 @@ static ModbusUdpSlave CreateModbusUdpSlave()
|
||||
.SetModbusDataLocater(new ModbusDataLocater(10, 10, 10, 10));//设置数据区
|
||||
})
|
||||
);
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
Console.WriteLine("服务已启动");
|
||||
return service;
|
||||
}
|
||||
@@ -95,7 +95,7 @@ static ModbusUdpSlave CreateModbusUdpSlave()
|
||||
static ModbusRtuSlave CreateModbusRtuSlave()
|
||||
{
|
||||
var service = new ModbusRtuSlave();
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
//设置串口
|
||||
.SetSerialPortOption(new SerialPortOption()
|
||||
{
|
||||
@@ -125,7 +125,7 @@ static ModbusRtuSlave CreateModbusRtuSlave()
|
||||
static ModbusRtuOverTcpSlave CreateModbusRtuOverTcpSlave()
|
||||
{
|
||||
var service = new ModbusRtuOverTcpSlave();
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
//监听端口
|
||||
.SetListenIPHosts(7810)
|
||||
.ConfigurePlugins(a =>
|
||||
@@ -136,7 +136,7 @@ static ModbusRtuOverTcpSlave CreateModbusRtuOverTcpSlave()
|
||||
.SetModbusDataLocater(new ModbusDataLocater(10, 10, 10, 10));//设置数据区
|
||||
})
|
||||
);
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
Console.WriteLine("服务已启动");
|
||||
return service;
|
||||
}
|
||||
@@ -148,7 +148,7 @@ static ModbusRtuOverTcpSlave CreateModbusRtuOverTcpSlave()
|
||||
static ModbusRtuOverUdpSlave CreateModbusRtuOverUdpSlave()
|
||||
{
|
||||
var service = new ModbusRtuOverUdpSlave();
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
//监听端口
|
||||
.SetBindIPHost(7811)
|
||||
.ConfigurePlugins(a =>
|
||||
@@ -159,7 +159,7 @@ static ModbusRtuOverUdpSlave CreateModbusRtuOverUdpSlave()
|
||||
.SetModbusDataLocater(new ModbusDataLocater(10, 10, 10, 10));//设置数据区
|
||||
})
|
||||
);
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
Console.WriteLine("服务已启动");
|
||||
return service;
|
||||
}
|
||||
@@ -175,7 +175,7 @@ static ModbusRtuOverUdpSlave CreateModbusRtuOverUdpSlave()
|
||||
static ModbusTcpSlave CreateModbusTcpSlave()
|
||||
{
|
||||
var service = new ModbusTcpSlave();
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
//监听端口
|
||||
.SetListenIPHosts(7808)
|
||||
.ConfigurePlugins(a =>
|
||||
@@ -202,7 +202,7 @@ static ModbusTcpSlave CreateModbusTcpSlave()
|
||||
});
|
||||
})
|
||||
);
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
Console.WriteLine("服务已启动");
|
||||
return service;
|
||||
}
|
||||
|
||||
@@ -28,8 +28,8 @@ static void Main(string[] args)
|
||||
var config = new TouchSocketConfig();
|
||||
config.SetListenIPHosts(new IPHost[] { new IPHost(7788) });
|
||||
|
||||
service.Setup(config);
|
||||
service.Start();
|
||||
await service.SetupAsync(config);
|
||||
await service.StartAsync();
|
||||
|
||||
Console.WriteLine("转发服务器已启动。已将7788端口转发到127.0.0.1:7789与127.0.0.1:7790地址");
|
||||
}
|
||||
|
||||
@@ -41,10 +41,10 @@ config.SetListenIPHosts(new IPHost[] { new IPHost("127.0.0.1:7789"), new IPHost(
|
||||
.SetDataHandlingAdapter(() => new PipelineDataHandlingAdapter());//配置适配器为Pipeline
|
||||
|
||||
//载入配置
|
||||
service.Setup(config);
|
||||
await service.SetupAsync(config);
|
||||
|
||||
//启动
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -77,8 +77,8 @@ title: 生成、获取代理
|
||||
VerifyToken = "Rpc"//连接验证口令。
|
||||
});
|
||||
|
||||
service.Setup(config);
|
||||
service.Start();
|
||||
await service.SetupAsync(config);
|
||||
await service.StartAsync();
|
||||
```
|
||||
|
||||
:::tip
|
||||
@@ -504,7 +504,7 @@ class MyDmtpRpcDispatchProxy : DmtpRpcDispatchProxy
|
||||
private static TcpDmtpClient GetTcpDmtpClient()
|
||||
{
|
||||
var client = new TcpDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
@@ -518,7 +518,7 @@ class MyDmtpRpcDispatchProxy : DmtpRpcDispatchProxy
|
||||
{
|
||||
VerifyToken = "Dmtp"//连接验证口令。
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
client.Logger.Info($"连接成功,Id={client.Id}");
|
||||
return client;
|
||||
}
|
||||
@@ -610,7 +610,7 @@ class MyDmtpRpcRealityProxy<T> : DmtpRpcRealityProxy<T>
|
||||
private static TcpDmtpClient GetTcpDmtpClient()
|
||||
{
|
||||
var client = new TcpDmtpClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
@@ -624,7 +624,7 @@ class MyDmtpRpcRealityProxy<T> : DmtpRpcRealityProxy<T>
|
||||
{
|
||||
VerifyToken = "Dmtp"
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
client.Logger.Info($"连接成功,Id={client.Id}");
|
||||
return client;
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ client.Received = async (c, e) =>
|
||||
await Console.Out.WriteLineAsync(Encoding.UTF8.GetString(e.ByteBlock,0,e.ByteBlock.Len));
|
||||
};
|
||||
|
||||
client.Setup(new TouchSocket.Core.TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocket.Core.TouchSocketConfig()
|
||||
.SetSerialPortOption(new SerialPortOption()
|
||||
{
|
||||
BaudRate = 9600,//波特率
|
||||
@@ -95,7 +95,7 @@ client.Setup(new TouchSocket.Core.TouchSocketConfig()
|
||||
StopBits = System.IO.Ports.StopBits.One//停止位
|
||||
}));
|
||||
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
Console.WriteLine("连接成功");
|
||||
```
|
||||
|
||||
@@ -120,7 +120,7 @@ class MySerialClient : SerialPortClientBase
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new MySerialClient();
|
||||
client.Setup(new TouchSocket.Core.TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocket.Core.TouchSocketConfig()
|
||||
.SetSerialPortOption(new SerialPortOption()
|
||||
{
|
||||
BaudRate = 9600,//波特率
|
||||
@@ -129,7 +129,7 @@ client.Setup(new TouchSocket.Core.TouchSocketConfig()
|
||||
PortName = "COM1",//COM
|
||||
StopBits = System.IO.Ports.StopBits.One//停止位
|
||||
}));
|
||||
client.Connect();//调用连接,当连接不成功时,会抛出异常。
|
||||
await client.ConnectAsync();//调用连接,当连接不成功时,会抛出异常。
|
||||
```
|
||||
|
||||
## 七、接收数据
|
||||
@@ -157,7 +157,7 @@ client.Received = (client, e) =>
|
||||
在使用串口时,可能更需要同步Read的情况。所以此处提供了异步读取方法。
|
||||
|
||||
```csharp showLineNumbers
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
using (var receiver = client.CreateReceiver())
|
||||
{
|
||||
@@ -179,7 +179,7 @@ using (var receiver = client.CreateReceiver())
|
||||
带有接收超时的情况:
|
||||
|
||||
```csharp {6} showLineNumbers
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
using (var receiver = client.CreateReceiver())
|
||||
{
|
||||
while (true)
|
||||
@@ -238,7 +238,7 @@ public class MyPlugin : PluginBase, ISerialReceivedPlugin<ISerialPortClient>
|
||||
|
||||
```csharp {13} showLineNumbers
|
||||
var client = new SerialPortClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetSerialPortOption(new SerialPortOption()
|
||||
{
|
||||
BaudRate = 9600,//波特率
|
||||
@@ -252,7 +252,7 @@ client.Setup(new TouchSocketConfig()
|
||||
a.Add<MyPlugin>();
|
||||
}));
|
||||
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
## 八、发送数据
|
||||
@@ -287,7 +287,7 @@ public virtual Task SendAsync(byte[] buffer, int offset, int length);
|
||||
WaitingClient是TouchSocket提供的一个等待客户端发送数据的客户端。例如:串口客户端发送一个Hello,等待对方回信Hi,此时即可使用WaitingClient。
|
||||
|
||||
```csharp showLineNumbers
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
//调用CreateWaitingClient获取到IWaitingClient的对象。
|
||||
var waitClient = client.CreateWaitingClient(new WaitingOptions()
|
||||
|
||||
@@ -21,7 +21,7 @@ Swagger是一个用于生成、描述和调用RESTful接口的Web服务。通俗
|
||||
|
||||
```csharp {14-15}
|
||||
var service = new HttpService();
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
.SetListenIPHosts(new IPHost[] { new IPHost(7789) })
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
@@ -40,7 +40,7 @@ service.Setup(new TouchSocketConfig()
|
||||
a.UseDefaultHttpServicePlugin();
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
Console.WriteLine("测试swagger http://127.0.0.1:7789/swagger/index.html");
|
||||
```
|
||||
@@ -156,7 +156,7 @@ class CloseException : Exception
|
||||
|
||||
```csharp {3}
|
||||
var service = new TcpService();
|
||||
service.Setup(new TouchSocketConfig()//载入配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//载入配置
|
||||
.SetContainer(new MyContainer())
|
||||
.SetListenIPHosts("tcp://127.0.0.1:7789", 7790)//同时监听两个地址
|
||||
.ConfigureContainer(a =>//容器的配置顺序应该在最前面
|
||||
@@ -172,7 +172,7 @@ service.Setup(new TouchSocketConfig()//载入配置
|
||||
//a.Add();//此处可以添加插件
|
||||
}));
|
||||
|
||||
service.Start();//启动
|
||||
await service.StartAsync();//启动
|
||||
```
|
||||
|
||||
:::info 提示
|
||||
|
||||
@@ -86,10 +86,10 @@ config.SetListenIPHosts(new IPHost[] { new IPHost("127.0.0.1:7789"), new IPHost(
|
||||
});
|
||||
|
||||
//载入配置
|
||||
service.Setup(config);
|
||||
await service.SetupAsync(config);
|
||||
|
||||
//启动
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info("服务器成功启动。");
|
||||
service.Logger.Info("使用:“Add 10 20”测试");
|
||||
|
||||
@@ -231,7 +231,7 @@ private static void Main(string[] args)
|
||||
|
||||
//服务器
|
||||
var service = new TcpService();
|
||||
service.Setup(new TouchSocketConfig()//载入配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//载入配置
|
||||
.SetListenIPHosts(new IPHost[] { new IPHost("127.0.0.1:7789"), new IPHost(7790) })//同时监听两个地址
|
||||
.SetTcpDataHandlingAdapter(() => new MyFixedHeaderDataHandlingAdapter())
|
||||
.ConfigureContainer(a =>
|
||||
@@ -243,7 +243,7 @@ private static void Main(string[] args)
|
||||
a.Add<HeartbeatAndReceivePlugin>();
|
||||
}));
|
||||
|
||||
service.Start();//启动
|
||||
await service.StartAsync();//启动
|
||||
service.Logger.Info("服务器成功启动");
|
||||
|
||||
//客户端
|
||||
|
||||
@@ -34,60 +34,11 @@ public partial class ApiServer : RpcServer
|
||||
this.m_logger = logger;
|
||||
}
|
||||
|
||||
[Router("[api]/[action]ab")]//此路由会以"/Server/Sumab"实现
|
||||
[Router("[api]/[action]")]//此路由会以"/Server/Sum"实现
|
||||
[WebApi(HttpMethodType.GET)]
|
||||
public int Sum(int a, int b)
|
||||
{
|
||||
return a + b;
|
||||
}
|
||||
|
||||
[WebApi(HttpMethodType.POST)]
|
||||
public int TestPost(MyClass myClass)
|
||||
{
|
||||
return myClass.A + myClass.B;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用调用上下文,响应文件下载。
|
||||
/// </summary>
|
||||
/// <param name="callContext"></param>
|
||||
[WebApi(HttpMethodType.GET)]
|
||||
public Task<string> DownloadFile(IWebApiCallContext callContext, string id)
|
||||
{
|
||||
if (id == "rrqm")
|
||||
{
|
||||
callContext.HttpContext.Response.FromFile(@"D:\System\Windows.iso", callContext.HttpContext.Request);
|
||||
return Task.FromResult("ok");
|
||||
}
|
||||
return Task.FromResult("id不正确。");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用调用上下文,获取实际请求体。
|
||||
/// </summary>
|
||||
/// <param name="callContext"></param>
|
||||
[WebApi(HttpMethodType.POST)]
|
||||
[Router("[api]/[action]")]
|
||||
public Task<string> PostContent(IWebApiCallContext callContext)
|
||||
{
|
||||
if (callContext.Caller is ITcpSessionClient SessionClient)
|
||||
{
|
||||
this.m_logger.Info($"IP:{SessionClient.IP},Port:{SessionClient.Port}");//获取Ip和端口
|
||||
}
|
||||
if (callContext.HttpContext.Request.TryGetContent(out var content))
|
||||
{
|
||||
this.m_logger.Info($"共计:{content.Length}");
|
||||
}
|
||||
|
||||
return Task.FromResult("ok");
|
||||
}
|
||||
}
|
||||
|
||||
public class MyClass
|
||||
{
|
||||
public int A { get; set; }
|
||||
public int B { get; set; }
|
||||
}
|
||||
```
|
||||
|
||||
@@ -96,36 +47,30 @@ public class MyClass
|
||||
更多注册Rpc的方法请看[注册Rpc服务](./rpcregister.mdx)
|
||||
|
||||
```csharp showLineNumbers
|
||||
var service = new HttpService();
|
||||
service.Setup(new TouchSocketConfig()
|
||||
.SetListenIPHosts(7789)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
a.AddRpcStore(store =>
|
||||
{
|
||||
store.RegisterServer<ApiServer>();//注册服务
|
||||
var service = new HttpService();
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
.SetListenIPHosts(7789)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
a.AddRpcStore(store =>
|
||||
{
|
||||
store.RegisterServer<ApiServer>();//注册服务
|
||||
});
|
||||
})
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
a.UseCheckClear();
|
||||
|
||||
#if DEBUG
|
||||
//下列代码,会生成客户端的调用代码。
|
||||
var codeString = store.GetProxyCodes("WebApiProxy", typeof(WebApiAttribute));
|
||||
File.WriteAllText("../../../WebApiProxy.cs", codeString);
|
||||
#endif
|
||||
});
|
||||
})
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
a.UseCheckClear();
|
||||
a.UseWebApi();
|
||||
|
||||
a.UseWebApi();
|
||||
//此插件是http的兜底插件,应该最后添加。作用是当所有路由不匹配时返回404.且内部也会处理Option请求。可以更好的处理来自浏览器的跨域探测。
|
||||
a.UseDefaultHttpServicePlugin();
|
||||
}));
|
||||
await service.StartAsync();
|
||||
|
||||
//此插件是http的兜底插件,应该最后添加。作用是当所有路由不匹配时返回404.且内部也会处理Option请求。可以更好的处理来自浏览器的跨域探测。
|
||||
a.UseDefaultHttpServicePlugin();
|
||||
}));
|
||||
service.Start();
|
||||
|
||||
Console.WriteLine("以下连接用于测试webApi");
|
||||
Console.WriteLine($"使用:http://127.0.0.1:7789/ApiServer/Sum?a=10&b=20");
|
||||
Console.WriteLine("以下连接用于测试webApi");
|
||||
Console.WriteLine($"使用:http://127.0.0.1:7789/ApiServer/Sum?a=10&b=20");
|
||||
```
|
||||
|
||||
|
||||
@@ -133,7 +78,7 @@ public class MyClass
|
||||
|
||||
### 5.1 Get规则
|
||||
|
||||
使用Get进行请求时,服务方法可以声明多个参数,但是每个参数都必须是基础类型或者字符串类型。
|
||||
使用Get进行请求时,服务方法可以声明多个参数,但是每个参数都必须是**简单类型**(包括字符串、DateTime等)。
|
||||
|
||||
```csharp showLineNumbers
|
||||
[WebApi(HttpMethodType.GET)]
|
||||
@@ -257,7 +202,7 @@ http://127.0.0.1:7789/ApiServer/Sum?a=10&b=20
|
||||
private static WebApiClient CreateWebApiClient()
|
||||
{
|
||||
var client = new WebApiClient();
|
||||
client.Connect("127.0.0.1:7789");
|
||||
await client.ConnectAsync("127.0.0.1:7789");
|
||||
Console.WriteLine("连接成功");
|
||||
return client;
|
||||
}
|
||||
@@ -281,7 +226,7 @@ Dotnet自带HttpClient则是通过连接池的方式访问。详情看[HttpClien
|
||||
private static WebApiClientSlim CreateWebApiClientSlim()
|
||||
{
|
||||
var client = new WebApiClientSlim(new System.Net.Http.HttpClient());
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("http://127.0.0.1:7789")
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
@@ -358,13 +303,13 @@ class MyWebApiDispatchProxy : WebApiDispatchProxy
|
||||
private static WebApiClient CreateWebApiClient()
|
||||
{
|
||||
var client = new WebApiClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("127.0.0.1:7789")
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
a.UseReconnection();
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
Console.WriteLine("连接成功");
|
||||
return client;
|
||||
}
|
||||
|
||||
@@ -29,13 +29,13 @@ import Tag from "@site/src/components/Tag.js";
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new WebSessionClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7789/ws")
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
client.Logger.Info("连接成功");
|
||||
```
|
||||
|
||||
@@ -52,7 +52,7 @@ wss://127.0.0.1:7789/ws
|
||||
```csharp showLineNumbers
|
||||
var client = new WebSessionClient();
|
||||
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost(new IPHost("wss://127.0.0.1:7789/ws"))
|
||||
.SetClientSslOption(
|
||||
new ClientSslOption()
|
||||
@@ -63,7 +63,7 @@ client.Setup(new TouchSocketConfig()
|
||||
CertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; }
|
||||
}));
|
||||
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
Console.WriteLine("连接成功");
|
||||
```
|
||||
@@ -84,13 +84,13 @@ WebSessionClient可以使用默认配置直接连接到服务器,同时也支
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new WebSessionClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
})
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7789/ws"));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
client.Logger.Info("通过ws://127.0.0.1:7789/ws连接成功");
|
||||
```
|
||||
@@ -101,13 +101,13 @@ client.Logger.Info("通过ws://127.0.0.1:7789/ws连接成功");
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new WebSessionClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
})
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7789/wsquery?token=123456"));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
client.Logger.Info("通过ws://127.0.0.1:7789/wsquery?token=123456连接成功");
|
||||
|
||||
@@ -119,7 +119,7 @@ client.Logger.Info("通过ws://127.0.0.1:7789/wsquery?token=123456连接成功")
|
||||
|
||||
```csharp showLineNumbers
|
||||
var client = new WebSessionClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
@@ -133,7 +133,7 @@ client.Setup(new TouchSocketConfig()
|
||||
});
|
||||
})
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7789/wsheader"));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
client.Logger.Info("通过ws://127.0.0.1:7789/wsheader连接成功");
|
||||
```
|
||||
@@ -150,7 +150,7 @@ WebSocket默认情况下是基于GET方式连接的,但是在一些更特殊
|
||||
|
||||
```csharp showLineNumbers
|
||||
using var client = new WebSessionClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
@@ -164,7 +164,7 @@ client.Setup(new TouchSocketConfig()
|
||||
});
|
||||
})
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7789/postws"));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
client.Logger.Info("通过ws://127.0.0.1:7789/postws连接成功");
|
||||
```
|
||||
@@ -306,7 +306,7 @@ public class MyWebSocketPlugin : PluginBase, IWebSocketReceivedPlugin
|
||||
|
||||
```csharp {10}
|
||||
var client = new WebSessionClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7789/ws")
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -316,7 +316,7 @@ client.Setup(new TouchSocketConfig()
|
||||
{
|
||||
a.Add<MyWebSocketPlugin>();
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
### 6.3 使用WebSocket显式ReadAsync
|
||||
|
||||
@@ -20,7 +20,7 @@ Websocket拥有自己的心跳数据格式,和响应心跳格式,专业名
|
||||
|
||||
```csharp {12}
|
||||
var service = new HttpService();
|
||||
service.Setup(new TouchSocketConfig()//加载配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//加载配置
|
||||
.SetListenIPHosts(7789)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -33,7 +33,7 @@ service.Setup(new TouchSocketConfig()//加载配置
|
||||
.UseAutoPong();//当收到ping报文时自动回应pong
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
```
|
||||
|
||||
:::tip 提示
|
||||
@@ -46,7 +46,7 @@ service.Start();
|
||||
|
||||
```csharp {10-11}
|
||||
var client = new WebSessionClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7789/ws")
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -57,7 +57,7 @@ client.Setup(new TouchSocketConfig()
|
||||
a.UseWebSocketHeartbeat()//使用心跳插件
|
||||
.SetTick(TimeSpan.FromSeconds(1));//每5秒ping一次。
|
||||
}));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
```
|
||||
|
||||
## 三、直接发送心跳
|
||||
|
||||
@@ -35,7 +35,7 @@ title: 创建WebSocket服务器
|
||||
|
||||
```csharp showLineNumbers
|
||||
var service = new HttpService();
|
||||
service.Setup(new TouchSocketConfig()//加载配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//加载配置
|
||||
.SetListenIPHosts(7789)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -48,7 +48,7 @@ service.Setup(new TouchSocketConfig()//加载配置
|
||||
.UseAutoPong();//当收到ping报文时自动回应pong
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info("服务器已启动");
|
||||
```
|
||||
@@ -59,7 +59,7 @@ service.Logger.Info("服务器已启动");
|
||||
|
||||
```csharp showLineNumbers
|
||||
var service = new HttpService();
|
||||
service.Setup(new TouchSocketConfig()//加载配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//加载配置
|
||||
.SetListenIPHosts(7789)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -72,7 +72,7 @@ service.Setup(new TouchSocketConfig()//加载配置
|
||||
.UseAutoPong();//当收到ping报文时自动回应pong
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info("服务器已启动");
|
||||
```
|
||||
@@ -134,7 +134,7 @@ private static bool VerifyConnection(IHttpSessionClient client, HttpContext cont
|
||||
|
||||
```csharp showLineNumbers
|
||||
var service = new HttpService();
|
||||
service.Setup(new TouchSocketConfig()//加载配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//加载配置
|
||||
.SetListenIPHosts(7789)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -149,7 +149,7 @@ service.Setup(new TouchSocketConfig()//加载配置
|
||||
});
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info("服务器已启动");
|
||||
```
|
||||
@@ -284,7 +284,7 @@ public class MyWebSocketPlugin : PluginBase, IWebSocketReceivedPlugin
|
||||
|
||||
```csharp {12}
|
||||
var service = new HttpService();
|
||||
service.Setup(new TouchSocketConfig()//加载配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//加载配置
|
||||
.SetListenIPHosts(7789)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -297,7 +297,7 @@ service.Setup(new TouchSocketConfig()//加载配置
|
||||
a.Add<MyWebSocketPlugin>();//自定义插件。
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
```
|
||||
|
||||
:::tip 提示
|
||||
@@ -361,7 +361,7 @@ class MyReadWebSocketPlugin : PluginBase, IWebSocketHandshakedPlugin
|
||||
private static HttpService CreateHttpService()
|
||||
{
|
||||
var service = new HttpService();
|
||||
service.Setup(new TouchSocketConfig()//加载配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//加载配置
|
||||
.SetListenIPHosts(7789)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -376,7 +376,7 @@ private static HttpService CreateHttpService()
|
||||
a.Add<MyReadWebSocketPlugin>();
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info("服务器已启动");
|
||||
service.Logger.Info("直接连接地址=>ws://127.0.0.1:7789/ws");
|
||||
|
||||
@@ -51,7 +51,7 @@ public class MyWSCommandLinePlugin : WebSocketCommandLinePlugin
|
||||
|
||||
```csharp {14}
|
||||
var service = new HttpService();
|
||||
service.Setup(new TouchSocketConfig()//加载配置
|
||||
await service.SetupAsync(new TouchSocketConfig()//加载配置
|
||||
.SetListenIPHosts(7789)
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
@@ -66,7 +66,7 @@ service.Setup(new TouchSocketConfig()//加载配置
|
||||
a.Add<MyWSCommandLinePlugin>();
|
||||
}));
|
||||
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
```
|
||||
|
||||
### 3.2 调用
|
||||
@@ -77,7 +77,7 @@ service.Start();
|
||||
|
||||
```csharp {18}
|
||||
var client = new WebSessionClient();
|
||||
client.Setup(new TouchSocketConfig()
|
||||
await client.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
@@ -91,7 +91,7 @@ client.Setup(new TouchSocketConfig()
|
||||
});
|
||||
})
|
||||
.SetRemoteIPHost("ws://127.0.0.1:7789/ws"));
|
||||
client.Connect();
|
||||
await client.ConnectAsync();
|
||||
|
||||
client.SendWithWS("Add 10 20");
|
||||
```
|
||||
|
||||
@@ -57,7 +57,7 @@ public class MyClass
|
||||
```csharp showLineNumbers
|
||||
var service = new HttpService();
|
||||
|
||||
service.Setup(new TouchSocketConfig()
|
||||
await service.SetupAsync(new TouchSocketConfig()
|
||||
.ConfigureContainer(a =>
|
||||
{
|
||||
a.AddConsoleLogger();
|
||||
@@ -77,7 +77,7 @@ service.Setup(new TouchSocketConfig()
|
||||
.SetXmlRpcUrl("/xmlRpc");
|
||||
})
|
||||
.SetListenIPHosts(7789));
|
||||
service.Start();
|
||||
await service.StartAsync();
|
||||
|
||||
service.Logger.Info("服务器已启动");
|
||||
```
|
||||
@@ -118,9 +118,9 @@ service.Logger.Info("服务器已启动");
|
||||
使用客户端调用,则是使用RPC的范式进行调用,使用比较简单。
|
||||
|
||||
```csharp showLineNumbers
|
||||
private static void Main(string[] args)
|
||||
private static async Task Main(string[] args)
|
||||
{
|
||||
var client = GetXmlRpcClient();
|
||||
var client =await GetXmlRpcClientAsync();
|
||||
|
||||
//直接调用
|
||||
var result1 = client.InvokeT<int>("Sum", InvokeOption.WaitInvoke, 10, 20);
|
||||
@@ -132,10 +132,10 @@ private static void Main(string[] args)
|
||||
Console.ReadKey();
|
||||
}
|
||||
|
||||
private static XmlRpcClient GetXmlRpcClient()
|
||||
private static async Task<XmlRpcClient> GetXmlRpcClientAsync()
|
||||
{
|
||||
var jsonRpcClient = new XmlRpcClient();
|
||||
jsonRpcClient.Connect("http://127.0.0.1:7789/xmlRpc");
|
||||
await jsonRpcClient.ConnectAsync("http://127.0.0.1:7789/xmlRpc");
|
||||
Console.WriteLine("连接成功");
|
||||
return jsonRpcClient;
|
||||
}
|
||||
@@ -145,7 +145,7 @@ private static XmlRpcClient GetXmlRpcClient()
|
||||
|
||||
在服务器端,注册完服务后,就可以生成客户端调用代码了。详细的操作可以查看[服务端代理生成](./rpcgenerateproxy.mdx)
|
||||
|
||||
```csharp {8-9}
|
||||
```csharp {6-7}
|
||||
a.AddRpcStore(store =>
|
||||
{
|
||||
store.RegisterServer<XmlServer>();
|
||||
@@ -174,23 +174,24 @@ var sum3 = client.Sum(10,20);
|
||||
/// 新建一个类,继承XmlRpcDispatchProxy,亦或者RpcDispatchProxy基类。
|
||||
/// 然后实现抽象方法,主要是能获取到调用的IRpcClient派生接口。
|
||||
/// </summary>
|
||||
class MyXmlRpcDispatchProxy : XmlRpcDispatchProxy
|
||||
internal class MyXmlRpcDispatchProxy : XmlRpcDispatchProxy
|
||||
{
|
||||
private readonly IXmlRpcClient m_client;
|
||||
|
||||
public MyXmlRpcDispatchProxy()
|
||||
{
|
||||
this.m_client = GetXmlRpcClient();
|
||||
this.m_client = GetXmlRpcClientAsync().GetFalseAwaitResult();
|
||||
}
|
||||
|
||||
public override IXmlRpcClient GetClient()
|
||||
{
|
||||
return this.m_client;
|
||||
}
|
||||
|
||||
private static XmlRpcClient GetXmlRpcClient()
|
||||
private static async Task<XmlRpcClient> GetXmlRpcClientAsync()
|
||||
{
|
||||
var jsonRpcClient = new XmlRpcClient();
|
||||
jsonRpcClient.Connect("http://127.0.0.1:7789/xmlRpc");
|
||||
await jsonRpcClient.ConnectAsync("http://127.0.0.1:7789/xmlRpc");
|
||||
Console.WriteLine("连接成功");
|
||||
return jsonRpcClient;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user