WebSocket 库 C# (.NET):SignalR、Fleck 和 WebSocketSharp
WebSocket 是一种基于 TCP 的全双工通信协议,允许服务器和客户端实时交换数据,无需持续的 HTTP 请求。在 C# (.NET) 生态系统中,有多个库可以简化 WebSocket 的集成。本文将介绍三种最流行的解决方案:SignalR(微软官方库)、Fleck(轻量级服务器)和 WebSocketSharp(通用客户端-服务器库)。
1. SignalR — 微软官方工具
SignalR 是 ASP.NET Core 的高级库,可根据客户端能力自动选择最佳传输方式(WebSocket、Server-Sent Events、Long Polling)。它非常适合创建聊天、仪表盘和游戏。
主要功能:
- 传输方式自动切换。
- 群组和广播。
- 支持扩展(Redis、Azure SignalR Service)。
- 与 JavaScript、.NET、Java 客户端集成。
C# 服务端 Hub 示例:
using Microsoft.AspNetCore.SignalR;
public class ChatHub : Hub{ public async Task SendMessage(string user, string message) { // 向所有连接的客户端广播消息 await Clients.All.SendAsync("ReceiveMessage", user, message); }
public override async Task OnConnectedAsync() { await Clients.Caller.SendAsync("Notify", "您已连接到聊天"); await base.OnConnectedAsync(); }}C# 客户端示例(控制台):
using Microsoft.AspNetCore.SignalR.Client;
var connection = new HubConnectionBuilder() .WithUrl("https://yourserver.com/chathub") .Build();
connection.On<string, string>("ReceiveMessage", (user, message) =>{ Console.WriteLine($"{user}: {message}");});
await connection.StartAsync();await connection.InvokeAsync("SendMessage", "User1", "你好!");2. Fleck — 极简 WebSocket 服务器
Fleck 是一个轻量级库,用于创建不依赖 ASP.NET 的 WebSocket 服务器。它非常适合不需要 SignalR 复杂抽象层的简单应用。
特点:
- 基于纯 TCP(无 HTTP)。
- 支持 SSL(WSS)。
- 无内置扩展支持 — 仅单进程。
Fleck 服务器示例:
using Fleck;
var server = new WebSocketServer("ws://0.0.0.0:8181");var connections = new List<IWebSocketConnection>();
server.Start(socket =>{ socket.OnOpen = () => { Console.WriteLine("客户端已连接"); connections.Add(socket); }; socket.OnClose = () => { Console.WriteLine("客户端已断开"); connections.Remove(socket); }; socket.OnMessage = message => { // 向所有客户端发送消息 foreach (var client in connections) { client.Send($"回声: {message}"); } };});
Console.WriteLine("服务器已启动于 ws://localhost:8181");Console.ReadLine();3. WebSocketSharp — 通用客户端和服务器
WebSocketSharp 是一个开源库,提供客户端和服务器端的 WebSocket 功能。它不依赖 ASP.NET,可在 .NET Framework 和 .NET Core 上运行。
关键功能:
- 支持 SSL/TLS 和代理。
- 事件驱动模型(OnOpen、OnClose、OnMessage、OnError)。
- 支持发送二进制数据(byte[])。
WebSocketSharp 客户端示例:
using WebSocketSharp;
using (var ws = new WebSocket("wss://echo.websocket.org")){ ws.OnMessage += (sender, e) =>