WebSocket библиотеки C# (.NET): SignalR, WebSocket4Net и клиент System.Net.WebSockets

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

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

Начать курс

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 — идеален для

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