实现Ping,Pong心跳

This commit is contained in:
zqm
2026-04-10 16:06:45 +08:00
parent b650404e4a
commit 9954ee2567
6 changed files with 343 additions and 7 deletions

View File

@@ -23,7 +23,7 @@ CubeLib/
- **事件驱动**:支持 Connected、Disconnected、Message、Error 等回调
- **自动重连**:支持指数退避的重连机制
- **自定义头**:支持设置 ClientType 等 HTTP 头
- **心跳保活**:可配置的心跳间隔
- **心跳保活**:可配置的心跳间隔,自动发送 ping、自动回复 pong、可选心跳确认回调
- **消息队列**:离线时自动缓存消息,连接后自动发送
- **调试模式**:可选的日志输出
@@ -78,6 +78,41 @@ async fn main() {
| `reconnect_delay_ms` | u64 | `1000` | 初始重连延迟(毫秒) |
| `debug_mode` | bool | `false` | 调试模式 |
| `heartbeat_interval_ms` | u64 | `30000` | 心跳间隔(毫秒)0=禁用 |
## 心跳机制
CubeLib 内置完整的心跳保活机制:
### 自动行为
- **发送 ping**:按配置的间隔自动向服务器发送 ping 消息
- **回复 pong**:收到服务器的 ping 后自动回复 pong无需应用层处理
- **心跳回调**:收到 pong 后触发 `on_heartbeat_ack` 回调,通知应用层延迟和服务器时间
### 使用方式
```rust
use cube_lib::websocket::{WebSocketClient, WebSocketConfig};
#[tokio::main]
async fn main() {
let config = WebSocketConfig::new("ws://localhost:8087/ws")
.with_heartbeat(30000); // 30秒心跳间隔
let mut client = WebSocketClient::new(config);
// 设置心跳确认回调(可选)
client.on_heartbeat_ack(|latency_ms, server_timestamp| {
println!("心跳延迟: {}ms, 服务端时间: {}", latency_ms, server_timestamp);
// 可根据延迟判断连接质量
});
client.connect().await;
}
```
### 消息格式
- **发送的 ping**`{"Type":"ping","Data":{"timestamp":"2024-01-01 12:00:00.000"}}`
- **回复的 pong**`{"Type":"pong","Data":{"timestamp":"2024-01-01 12:00:00.000"}}`
| `connect_timeout_ms` | u64 | `10000` | 连接超时(毫秒) |
| `max_queue_size` | usize | `100` | 消息队列最大长度 |
| `client_type` | Option\<String\> | `None` | 客户端类型标识 |