Files
TouchSocket/handbook/docs/websocketheartbeat.mdx
2025-05-11 20:57:10 +08:00

101 lines
2.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: websocketheartbeat
title: Websocket心跳设置
---
### 定义
命名空间TouchSocket.Http.WebSockets <br/>
程序集:[TouchSocket.Http.dll](https://www.nuget.org/packages/TouchSocket.Http)
## 一、说明
Websocket拥有自己的心跳数据格式和响应心跳格式专业名词是Ping和Pong。所以依靠这两个可以直接实现心跳。
## 二、心跳配置
#### 2.1 服务器配置
服务器在添加WebSocket功能时可以直接启用自动回应Ping。
```csharp {12}
var service = new HttpService();
await service.SetupAsync(new TouchSocketConfig()//加载配置
.SetListenIPHosts(7789)
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
})
.ConfigurePlugins(a =>
{
a.UseWebSocket()//添加WebSocket功能
.SetWSUrl("/ws")
.UseAutoPong();//当收到ping报文时自动回应pong
}));
await service.StartAsync();
```
:::tip 提示
**UseAutoPong**非必须操作如果不设置的话自己在插件处理Ping报文也可以。
:::
#### 2.2 客户端使用心跳插件
```csharp {10-11}
var client = new WebSocketClient();
await client.SetupAsync(new TouchSocketConfig()
.SetRemoteIPHost("ws://127.0.0.1:7789/ws")
.ConfigureContainer(a =>
{
a.AddFileLogger();
})
.ConfigurePlugins(a =>
{
a.UseWebSocketHeartbeat()//使用心跳插件
.SetTick(TimeSpan.FromSeconds(1));//每5秒ping一次。
}));
await client.ConnectAsync();
```
## 三、直接发送心跳
直接发送心跳,可以直接使用扩展方法。
```csharp showLineNumbers
await client.PingAsync();
await client.PongAsync();
```
或者自己构建数据帧
```csharp showLineNumbers
WSDataFrame dataFrame = new WSDataFrame()
{
FIN = true,
Opcode = WSDataType.Ping
};
//WSDataFrame dataFrame = new WSDataFrame()
//{
// FIN = true,
// Opcode = WSDataType.Pong
//};
client.SendAsync(dataFrame);
```
:::caution 注意
自己构建数据帧还应该设置Make等其他参数。
:::
:::tip 提示
无论是Ping还是Pong服务器和客户端都支持发送和接收。但是一般建议由客户端Ping服务器只负责Pong即可。
:::
[本文示例Demo](https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/WebSocket/WebSocketConsoleApp)