C# 上的 WebSocket:高级实时应用开发

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

简介:为什么C#中的WebSocket是专业人士的选择

在现代Web开发中,实时交互已成为标配。交易平台、监控系统、在线游戏和聊天——所有这些都需要即时数据传输。C#(.NET)中的WebSocket技术为创建此类应用提供了强大而灵活的工具。与HTTP轮询不同,WebSocket建立持久双向连接,从而大幅降低延迟和服务器负载。

在本文中,我们将探索C#中WebSocket工作的高级方面。您将学习如何构建容错服务器、管理数千个并发连接、处理错误以及将WebSocket与流行框架集成。本文面向已熟悉.NET基础和异步编程的开发者。



C#中高级WebSocket服务器的架构

一个基本的C# WebSocket服务器示例通常局限于单个处理器。生产级解决方案需要深思熟虑的架构。让我们看看关键组件。



连接管理与客户端标识

不要使用简单的连接列表,而是使用ConcurrentDictionary进行线程安全存储。为每个客户端分配唯一标识符(GUID),并存储元数据(例如用户名、分组)。

public class WebSocketConnectionManager{    private readonly ConcurrentDictionary<string, WebSocket> _connections = new();    private readonly ConcurrentDictionary<string, UserMetadata> _users = new();

public string AddConnection(WebSocket socket, UserMetadata metadata) { var id = Guid.NewGuid().ToString(); _connections.TryAdd(id, socket); _users.TryAdd(id, metadata); return id; }

public async Task RemoveConnection(string id) { if (_connections.TryRemove(id, out var socket) && socket.State == WebSocketState.Open) { await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed", CancellationToken.None); } _users.TryRemove(id, out _); }

public WebSocket? GetSocketById(string id) => _connections.GetValueOrDefault(id);}

这种方法允许您轻松地向特定用户、分组或所有用户发送消息。



处理分片消息

在实际应用中,数据可能会分片到达。标准的ReceiveAsync方法只返回一个分片。要组装完整消息,请使用循环:

public async Task<byte[]> ReceiveFullMessageAsync(WebSocket socket, CancellationToken ct){    using var ms = new MemoryStream();    WebSocketReceiveResult result;    var buffer = new byte[1024 * 4]; // 4KB缓冲区

do { result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), ct); ms.Write(buffer, 0, result.Count); } while (!result.EndOfMessage);

return ms.ToArray();}

这对于传输大型JSON对象或二进制数据(图片、文件)至关重要。



扩展:SignalR vs 原生WebSocket

对于复杂应用,需要选择底层WebSocket和SignalR(微软提供的抽象WebSocket的库)。让我们看看不同场景。



何时使用原生WebSocket

  • 追求最大性能和最小开销。
  • 自定义传输协议(二进制数据、自定义帧)。
  • 与非.NET客户端(例如Go或Rust)集成。
  • 完全控制连接管理。


何时选择SignalR

  • 通过Redis背板或Azure SignalR服务实现自动扩展。
  • 支持回退传输(长轮询、服务器推送)。

博客

书籍推荐