WebSocket библиотека C# (.NET): SignalR и альтернативные инструменты для реального времени
В современной веб-разработке потребность в двусторонней связи в реальном времени стала стандартом. Чат-приложения, онлайн-игры, торговые платформы, мониторинг серверов — всё это требует мгновенной передачи данных. Для языка C# (.NET) существует несколько мощных библиотек, реализующих протокол WebSocket. В этой статье мы подробно разберём SignalR — флагманскую библиотеку от Microsoft, а также рассмотрим альтернативы: WebSocketSharp и Fleck. Вы узнаете, как выбрать подходящий инструмент и как быстро начать работу.
Что такое WebSocket и зачем он нужен в C#
WebSocket — это протокол, который обеспечивает полнодуплексную связь между клиентом и сервером через одно долгоживущее TCP-соединение. В отличие от HTTP, где клиент отправляет запрос и ждёт ответ, WebSocket позволяет серверу инициировать отправку данных в любой момент. Для платформы .NET это особенно важно, так как C# традиционно силён в серверной разработке, а WebSocket расширяет его возможности для real-time сценариев.
SignalR — официальное решение от Microsoft
SignalR — это библиотека для ASP.NET Core, которая абстрагирует работу с WebSocket, предоставляя высокоуровневый API. Она автоматически выбирает лучший транспорт: WebSocket, Server-Sent Events (SSE) или Long Polling. SignalR идеально подходит для enterprise-проектов, где важна масштабируемость и интеграция с экосистемой .NET.
Установка SignalR
dotnet add package Microsoft.AspNetCore.SignalR
Пример простого чата на 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);
}
}
Настройка в 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 WebSocketSharp
Пример WebSocket-сервера
using WebSocketSharp;
using WebSocketSharp.Server;
public class Echo : WebSocketBehavior
{
protected override void OnMessage(MessageEventArgs e)
{
Send($"Эхо: {e.Data}");
}
}
class Program
{
static void Main()
{
var wsServer = new WebSocketServer("ws://localhost:8080");
wsServer.AddWebSocketService<Echo>("/echo");
wsServer.Start();
Console.ReadKey();
wsServer.Stop();
}
}
Пример WebSocket-клиента
using WebSocketSharp;
var ws = new WebSocket("ws://localhost:8080/echo");
ws.OnMessage += (sender, e) => Console.WriteLine($"Ответ: {e.Data}");
ws.Connect();
ws.Send("Привет, сервер!");
Преимущества WebSocketSharp:
- Минимальное потребление ресурсов
- Работает на .NET Framework, .NET Core, Mono (включая Unity)
- Простой API без сложных конфигураций
- Поддержка SSL/TLS, прокси, сжатия сообщений