Что такое WebSocket?

«Что такое WebSocket?» — вопрос из категории Сети, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые преимущества:

  • Режим реального времени: идеально подходит для чатов, live-уведомлений, онлайн-игр, торговых платформ.
  • Низкие накладные расходы: после установки соединения данные передаются с минимальным заголовком, в отличие от постоянных HTTP-запросов (polling/long-polling).
  • Поддержка текстовых и бинарных данных.

Пример реализации сервера на C# (ASP.NET Core):

// Program.cs - настройка middleware
app.UseWebSockets();

app.Use(async (context, next) =>
{
    if (context.WebSockets.IsWebSocketRequest)
    {
        using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
        await HandleWebSocketConnection(webSocket); // Основной цикл обработки
    }
    else
    {
        await next();
    }
});

// Обработчик соединения
private static async Task HandleWebSocketConnection(WebSocket webSocket)
{
    var buffer = new byte[1024 * 4]; // Буфер для приема данных
    try
    {
        WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        while (!result.CloseStatus.HasValue)
        {
            // Эхо-сервер: отправляем обратно полученное сообщение
            await webSocket.SendAsync(
                new ArraySegment<byte>(buffer, 0, result.Count),
                result.MessageType,
                result.EndOfMessage,
                CancellationToken.None);

            result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        }
        // Корректное закрытие соединения
        await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
    }
    catch (WebSocketException)
    {
        // Обработка разрыва соединения
    }
}

Практическое применение: Для работы с WebSocket на клиенте в браузере используется нативный JavaScript API WebSocket. В .NET-клиентских приложениях можно использовать класс System.Net.WebSockets.ClientWebSocket.

Видео-ответы