WebSocket 库 C# (.NET):SignalR 和实时通信的替代工具
在现代 Web 开发中,实时双向通信的需求已成为标准。聊天应用、在线游戏、交易平台、服务器监控——所有这些都需要即时数据传输。对于 C# (.NET) 语言,有多个强大的库实现了 WebSocket 协议。在本文中,我们将详细分析 SignalR——微软的旗舰库,并探讨替代方案:WebSocketSharp 和 Fleck。您将了解如何选择合适的工具以及如何快速开始使用。
什么是 WebSocket,为什么在 C# 中需要它
WebSocket 是一种协议,通过单个长期存在的 TCP 连接在客户端和服务器之间提供全双工通信。与客户端发送请求并等待响应的 HTTP 不同,WebSocket 允许服务器随时发起数据发送。对于 .NET 平台来说,这一点尤其重要,因为 C# 传统上在服务器端开发方面很强,而 WebSocket 扩展了其在实时场景中的能力。
SignalR——微软的官方解决方案
SignalR 是一个用于 ASP.NET Core 的库,它抽象了 WebSocket 的工作,提供了高级 API。它会自动选择最佳传输方式:WebSocket、Server-Sent Events (SSE) 或 Long Polling。SignalR 非常适合企业级项目,在这些项目中,可扩展性和与 .NET 生态系统的集成非常重要。
安装 SignalR
dotnet add package Microsoft.AspNetCore.SignalRSignalR 简单聊天示例
创建一个 Hub——用于管理连接的中心类:
using Microsoft.AspNetCore.SignalR;
public class ChatHub : Hub{ public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); }}在 Program.cs 中进行配置:
var builder = WebApplication.CreateBuilder(args);builder.Services.AddSignalR();
var app = builder.Build();app.MapHub<ChatHub>("/chat");
app.Run();JavaScript 客户端:
const connection = new signalR.HubConnectionBuilder() .withUrl("/chat") .build();
connection.on("ReceiveMessage", (user, message) => { console.log(`${user}: ${message}`);});
connection.start().catch(err => console.error(err));SignalR 的优点:
- 自动选择传输方式 (WebSocket, SSE, Long Polling)
- 支持群发和定向发送给特定用户
- 内置断线重连处理
- 与 ASP.NET Core Identity 身份验证集成
- 通过 Redis Backplane 或 Azure SignalR Service 进行扩展
缺点:
- 对于简单项目来说过于臃肿
- 依赖 ASP.NET Core (无法在控制台应用中使用)
- 在非标准场景下配置复杂
WebSocketSharp——适用于 .NET Framework 和 .NET Core 的轻量级库
WebSocketSharp 是一个极简主义库,它实现了 WebSocket 协议,没有多余的抽象。它适用于创建服务器端和客户端 WebSocket 连接。非常适合嵌入到控制台应用或 Unity 游戏中。
通过 NuGet 安装
dotnet add package WebSocketSharpWebSocket 服务器示例
using WebSocketSharp;using WebSocketSharp.Server;
public class Echo : WebSocketBehavior{ protected override void OnMessage(MessageEventArgs e) { Send($"Echo: {e.Data}"); }}
class Program{ static void Main() { va