WebSocket библиотеки C# (.NET): реальное время в ваших приложениях
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), CancellationToken.None);
Console.WriteLine("Подключено к серверу");
// Отправка сообщения
var sendBytes = Encoding.UTF8.GetBytes("Hello from C#");
await ws.SendAsync(new ArraySegment<byte>(sendBytes),
WebSocketMessageType.Text,
true,
CancellationToken.None);
// Приём ответа
var buffer = new byte[1024];
var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer),
CancellationToken.None);
var response = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"Ответ: {response}");
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", CancellationToken.None);
}
Сравнение библиотек
- SignalR — лучший выбор для ASP.NET Core приложений, где нужна масштабируемая рассылка сообщений, группы, аутентификация и автоматическое восстановление соединения.
- WebSocket4Net — идеален для
Также в библиотеке
JWT токены в JavaScript (Node.js): полное руководство
Protocol Buffers для C++: полное руководство с примерами
Геолокация и карты в Java: обзор библиотек и инструментов
Работа с датами в Java: обзор библиотек java.time, Joda-Time и Apache Commons
Отправка email на Swift: библиотеки и примеры для iOS/macOS