Что такое WebSocket?

Ответ

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.

Ответ 18+ 🔞

Вот, смотри, WebSocket — это такая штука, которая позволяет тебе держать постоянную трубку между клиентом и сервером, как будто ты позвонил другу и не кладёшь трубку, а просто болтаешь, когда захотел. В отличие от обычного HTTP, где ты каждый раз, как идиот, должен стучаться в дверь, кричать «Привет!», получать ответ и уходить. А если тебе нужно десять сообщений подряд — десять раз стучаться, блядь. Полный пиздец.

Зачем это нужно, спросишь? Да всё просто:

  • Мгновенная связь: чаты, уведомления, онлайн-игры, биржевые тикеры — всё, где задержка в секунду это уже пиздец как много.
  • Экономия всего: после рукопожатия данные летают с минимальными накладками, без этих ебанутых HTTP-заголовков в каждом запросе.
  • Всё подряд можно гнать: и текст, и бинарный мусор — без проблем.

Сервак на C# (ASP.NET Core), смотри как просто:

// Program.cs - настраиваем, чтобы он слушал
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)
    {
        // Клиент взял и сдох, связь порвалась. Ну и хуй с ним.
    }
}

Как этим пользоваться? В браузере — нативный JS WebSocket. В .NET-приложении — ClientWebSocket. Всё, больше никакого долбанного опроса сервера каждую секунду. Живи и радуйся.

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