Ответ
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. Всё, больше никакого долбанного опроса сервера каждую секунду. Живи и радуйся.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶