WebSocket библиотеки C# (.NET): SignalR, Fleck, WebSocketSharp

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

WebSocket библиотеки C# (.NET): SignalR, Fleck и WebSocketSharp

WebSocket — это протокол полнодуплексной связи поверх TCP, позволяющий серверу и клиенту обмениваться данными в реальном времени без постоянных HTTP-запросов. В экосистеме C# (.NET) существует несколько библиотек, которые упрощают интеграцию WebSocket. В этой статье мы рассмотрим три наиболее популярных решения: SignalR (официальная библиотека Microsoft), Fleck (лёгкий сервер) и WebSocketSharp (универсальный клиент-сервер).

1. SignalR — официальный инструмент от Microsoft

SignalR — это высокоуровневая библиотека для ASP.NET Core, которая автоматически выбирает лучший транспорт (WebSocket, Server-Sent Events, Long Polling) в зависимости от возможностей клиента. Она идеально подходит для создания чатов, дашбордов и игр.

Основные возможности:

  • Автоматическое переключение между транспортами.
  • Группы и широковещательные рассылки.
  • Поддержка масштабирования (Redis, Azure SignalR Service).
  • Интеграция с клиентами на JavaScript, .NET, Java.

Пример серверного хаба на C#:

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# (Console):

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 — это лёгкая библиотека для создания WebSocket серверов без зависимостей от ASP.NET. Она идеально подходит для простых приложений, где не нужны сложные абстракции 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) =>
    {
        Console.WriteLine($"Получено: {e.Data}");
    };

    ws.Connect();
    ws.Send("Привет, WebSocket!");
    Console.ReadLine();
}

Пример сервера на WebSocketSharp:

using WebSocketSharp.Server;

public class EchoService : WebSocketBehavior
{
    protected override void OnMessage(MessageEventArgs e)
    {
        Send($"Эхо: {e.Data}");
    }
}

var server = new WebSocketServer("ws://localhost:8080");
server.AddWebSocketService<EchoService>("/echo");
server.Start();
Console.WriteLine("Сервер запущен. Нажмите Enter для остановки.");
Console.ReadLine();
server.Stop();

Сравнение библиотек

Рекомендаций