C# (.NET) WebSocket 库:在您的应用中实现实时通信
WebSocket 是一种协议,可在客户端和服务器之间建立持久的双向连接。在 C# (.NET) 生态系统中,有多个成熟的 WebSocket 库,既适用于服务器端应用程序(ASP.NET Core),也适用于客户端(桌面、移动、控制台)。本文将介绍三个关键工具:SignalR(高级框架)、WebSocket4Net(跨平台客户端)以及内置的 System.Net.WebSockets(低级 API)。
1. SignalR — 通用实时框架
SignalR 是 ASP.NET Core 的一部分,它抽象了 WebSocket、Server-Sent Events 和 Long Polling 的工作。它会自动选择最佳传输方式,并提供便捷的 API 用于向组、单个用户和所有连接的客户端广播消息。
安装
dotnet add package Microsoft.AspNetCore.SignalR服务器端示例(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 base.OnConnectedAsync(); Console.WriteLine($"客户端已连接:{Context.ConnectionId}"); }
public override async Task OnDisconnectedAsync(Exception? exception) { await base.OnDisconnectedAsync(exception); Console.WriteLine($"客户端已断开:{Context.ConnectionId}"); }}客户端示例(C#)
using Microsoft.AspNetCore.SignalR.Client;
var connection = new HubConnectionBuilder() .WithUrl("https://localhost:5001/chatHub") .Build();
connection.On<string, string>("ReceiveMessage", (user, message) =>{ Console.WriteLine($"{user}: {message}");});
await connection.StartAsync();await connection.InvokeAsync("SendMessage", "机器人", "你好,世界!");2. WebSocket4Net — 适用于 .NET Framework 和 .NET Core 的轻量级客户端
WebSocket4Net 是一个独立的库,支持标准 WebSocket(RFC 6455)和专有扩展(例如,使用自签名证书的 WSS)。它特别适用于运行在 .NET Framework(Windows Forms、WPF)或对现代 API 支持有限的环境中的应用程序。
通过 NuGet 安装
Install-Package WebSocket4Net客户端示例
using WebSocket4Net;
var ws = new WebSocket("wss://echo.websocket.org");
ws.Opened += (s, e) =>{ Console.WriteLine("连接已建立"); ws.Send("你好,WebSocket!");};
ws.MessageReceived += (s, e) =>{ Console.WriteLine($"收到消息:{e.Message}");};
ws.Closed += (s, e) =>{ Console.WriteLine("连接已关闭");};
ws.Error += (s, e) =>{ Console.WriteLine($"错误:{e.Exception.Message}");};
ws.Open();Console.ReadLine();3. System.Net.WebSockets — 内置低级 API
从 .NET Framework 4.5 开始以及所有 .NET Core 版本中,都提供了内置类 System.Net.WebSockets.ClientWebSocket。它无需安装额外包,并提供了对连接的完全控制,但需要手动管理缓冲区和异步操作。
使用 ClientWebSocket 的客户端示例
using System.Net.WebSockets;using System.Text;
public async Task ConnectAndSendAsync(string uri){ using var ws = new ClientWebSocket(); await ws.ConnectAsync(new Uri(uri), CancellationTok