在现代网络应用中,WebSocket 是实现实时双向通信的重要技术。然而,由于网络波动、防火墙超时或服务器策略等原因,长时间空闲的 WebSocket 连接可能会被意外断开。为了解决这个问题,开发者通常会引入心跳检测机制来维持连接活跃状态。
本文将手把手教你如何在 C# 中实现一个简单而有效的 WebSocket 心跳检测 功能,即使你是编程小白,也能轻松理解并应用到自己的项目中。
心跳检测(Heartbeat)是一种用于检测连接是否仍然存活的机制。客户端和服务器定期互相发送“心跳包”(通常是简单的 Ping/Pong 消息),如果一方在规定时间内未收到回应,则认为连接已断开,并进行重连或其他处理。
在 C# 中使用 System.Net.WebSockets 命名空间提供的 ClientWebSocket 类,我们可以轻松实现这一功能。
首先,我们需要建立一个 WebSocket 连接:
using System;using System.Net.WebSockets;using System.Text;using System.Threading;using System.Threading.Tasks;class WebSocketClient{ private ClientWebSocket _webSocket; private readonly Uri _uri; private CancellationTokenSource _cts; public WebSocketClient(string url) { _uri = new Uri(url); _webSocket = new ClientWebSocket(); _cts = new CancellationTokenSource(); } public async Task ConnectAsync() { await _webSocket.ConnectAsync(_uri, CancellationToken.None); Console.WriteLine("WebSocket 连接成功!"); }} 我们通过一个定时器(或后台任务)定期向服务器发送 Ping 消息。通常使用文本消息如 {"type":"ping"},或者直接使用 WebSocket 协议内置的 Ping/Pong 控制帧(但 .NET 的 ClientWebSocket 不直接暴露控制帧 API,因此常用文本模拟)。
private async Task StartHeartbeatAsync(int intervalSeconds = 30){ while (!_cts.Token.IsCancellationRequested) { try { if (_webSocket.State == WebSocketState.Open) { var pingMessage = Encoding.UTF8.GetBytes("{\"type\":\"ping\"}"); await _webSocket.SendAsync( new ArraySegment<byte>(pingMessage), WebSocketMessageType.Text, true, _cts.Token); Console.WriteLine("[心跳] 已发送 Ping 消息"); } } catch (Exception ex) { Console.WriteLine($"[心跳] 发送失败: {ex.Message}"); break; } // 等待指定间隔(例如30秒) await Task.Delay(TimeSpan.FromSeconds(intervalSeconds), _cts.Token); }} 理想情况下,服务器收到 Ping 后应回复 Pong。你可以在接收消息的循环中判断是否为 Pong 响应,并更新“最后收到心跳时间”。若超时未收到,则主动断开连接。
public async Task ReceiveMessagesAsync(){ var buffer = new byte[1024 * 4]; while (_webSocket.State == WebSocketState.Open) { var result = await _webSocket.ReceiveAsync( new ArraySegment<byte>(buffer), _cts.Token); if (result.MessageType == WebSocketMessageType.Close) { await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); break; } var message = Encoding.UTF8.GetString(buffer, 0, result.Count); Console.WriteLine($"收到消息: {message}"); // 如果是 Pong 响应,可记录时间或忽略 if (message.Contains("pong") || message.Contains("ping")) { Console.WriteLine("[心跳] 收到服务器响应"); } }} 将连接、心跳、消息接收整合起来:
public async Task StartAsync(){ await ConnectAsync(); // 并行启动心跳和消息接收 var heartbeatTask = StartHeartbeatAsync(30); // 每30秒一次 var receiveTask = ReceiveMessagesAsync(); // 等待任一任务结束(如连接关闭) await Task.WhenAny(heartbeatTask, receiveTask); Console.WriteLine("WebSocket 连接已终止。");}// 使用示例static async Task Main(string[] args){ var client = new WebSocketClient("wss://your-websocket-server.com/ws"); await client.StartAsync();} CancellationToken 支持下优雅取消心跳任务,防止内存泄漏。通过本文,你已经掌握了如何在 C# 中实现 WebSocket 心跳检测。这项技术对于构建高可用的实时应用(如聊天系统、股票行情推送、在线游戏等)至关重要。记住关键词:C# WebSocket 心跳检测、WebSocket 心跳机制、C# 实现 WebSocket 心跳 和 C# WebSocket 连接保活,它们是你后续深入学习和 SEO 优化的核心。
现在,就去给你的 WebSocket 应用加上心跳吧!让连接更稳定,用户体验更流畅!
本文由主机测评网于2025-12-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025127631.html