C# (.NET) WebSocket 库:SignalR、WebSocket4Net 和 System.Net.WebSockets 客户端

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

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

开始课程

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

推荐