← Назад к вопросам

Что такое Websocket?

1.6 Junior🔥 192 комментариев
#Основы C# и .NET

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое WebSocket?

WebSocket — это современный сетевой протокол связи, предоставляющий полнодуплексный (full-duplex) канал передачи данных между клиентом (обычно веб-браузером) и сервером через одно долгоживущее TCP-соединение. В отличие от традиционного HTTP, который работает по модели «запрос-ответ», WebSocket позволяет обоим сторонам обмениваться данными в реальном времени без необходимости постоянных переподключений.

Ключевые особенности WebSocket

  1. Двусторонняя связь (Full-Duplex): Сервер и клиент могут отправлять данные независимо и одновременно, что идеально подходит для приложений реального времени.
  2. Единое соединение: После установки соединения (рукопожатия) канал остаётся открытым, снижая накладные расходы на повторные HTTP-запросы.
  3. Низкая задержка: Данные передаются мгновенно, без задержек, характерных для опросов (polling) по HTTP.
  4. Легкий протокол: Заголовки пакетов данных минимальны (всего 2-10 байт), что эффективно для частых небольших сообщений.

Как работает установка соединения (Handshake)

Процесс начинается с HTTP-рукопожатия, после которого соединение «апгрейдится» до WebSocket:

  1. Клиент отправляет HTTP-запрос с заголовком Upgrade: websocket.
  2. Сервер подтверждает переход, отправляя ответ с кодом 101 Switching Protocols.
  3. Далее общение происходит по протоколу WebSocket.

Пример рукопожатия в C# с использованием System.Net.WebSockets:

using System.Net.WebSockets;
using System.Text;

// На стороне сервера (упрощённый пример в ASP.NET Core)
app.Use(async (context, next) =>
{
    if (context.Request.Path == "/ws")
    {
        if (context.WebSockets.IsWebSocketRequest)
        {
            WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
            await HandleWebSocketAsync(webSocket);
        }
        else
        {
            context.Response.StatusCode = 400;
        }
    }
    else
    {
        await next();
    }
});

async Task HandleWebSocketAsync(WebSocket webSocket)
{
    var buffer = new byte[1024 * 4];
    WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
    
    while (!result.CloseStatus.HasValue)
    {
        // Делаем что-то с данными
        string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
        await webSocket.SendAsync(Encoding.UTF8.GetBytes($"Echo: {message}"), 
                                  WebSocketMessageType.Text, 
                                  true, 
                                  CancellationToken.None);
        
        result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
    }
    
    await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}

Преимущества WebSocket по сравнению с HTTP-подходами

  • Против Long Polling/SSE: WebSocket обеспечивает истинную двустороннюю связь, тогда как Server-Sent Events (SSE) — только сервер → клиент, а Long Polling создаёт задержки и нагрузку.
  • Эффективность: Нет избыточных заголовков HTTP в каждом сообщении.
  • Масштабируемость: Одно соединение на клиента против множества HTTP-запросов.

Типичные сценарии использования

  • Онлайн-чаты и мессенджеры — мгновенная доставка сообщений.
  • Многопользовательские онлайн-игры — синхронизация состояния в реальном времени.
  • Финансовые платформы — биржевые тикеры, обновления котировок.
  • Совместные редакторы — например, Google Docs, где изменения видны сразу.
  • IoT и мониторинг — передача телеметрии с устройств.

Особенности реализации в C# Backend

В экосистеме .NET для работы с WebSocket доступны:

  1. System.Net.WebSockets — низкоуровневый API, встроенный в .NET Core/.NET 5+.
  2. SignalR — высокоуровневая библиотека от Microsoft, которая использует WebSocket как основной транспорт, но предоставляет абстракции (хабы, группы) и fallback-механизмы (Long Polling, SSE).

Пример использования SignalR:

// Хаб SignalR
public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

// Клиентское подключение (JavaScript)
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub")
    .build();

connection.on("ReceiveMessage", (user, message) => {
    // Обработка сообщения
});

Ограничения и важные аспекты

  • Прокси и балансировщики нагрузки: Некоторые прокси-серверы не поддерживают WebSocket, требуется настройка (например, в Nginx).
  • Управление состоянием соединения: Необходимо обрабатывать разрывы, повторные подключения, «здоровье» соединения (ping/pong фреймы).
  • Безопасность: Всегда используйте wss:// (WebSocket over TLS) в production, аналогично HTTPS.

WebSocket стал стандартом для веб-приложений реального времени, и его поддержка в .NET, особенно через SignalR, позволяет создавать высокопроизводительные и масштабируемые backend-системы для современных интерактивных приложений.