Ответ
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.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶