WebSocket — это современный протокол, обеспечивающий двустороннюю связь между клиентом и сервером поверх TCP. В отличие от классического HTTP, WebSocket поддерживает постоянное соединение, что позволяет обмениваться данными в реальном времени без необходимости многократных запросов.
Для установления соединения используется объект
WebSocket. Он принимает один обязательный аргумент — URL
сервера с протоколом ws:// или wss://
(защищённая версия):
const socket = new WebSocket('ws://localhost:8080');
Ключевые моменты при создании соединения:
readyState — свойство, отражающее состояние
соединения:
0 — CONNECTING (подключение устанавливается)1 — OPEN (соединение открыто)2 — CLOSING (соединение закрывается)3 — CLOSED (соединение закрыто или не может быть
установлено)События onopen, onmessage,
onerror, onclose позволяют управлять жизненным
циклом соединения.
Для передачи данных используется метод send():
socket.send(JSON.stringify({ type: 'greeting', message: 'Hello, server!' }));
Сообщения принимаются через обработчик события
message:
socket.onmess age = (event) => {
const data = JSON.parse(event.data);
console.log(data);
};
Важно учитывать, что WebSocket передаёт данные в формате текста или
бинарного потока (Blob или ArrayBuffer), и при
работе с объектами обычно применяется сериализация через
JSON.stringify/JSON.parse.
Закрытие соединения производится методом close():
socket.close(1000, 'Normal closure');
Аргументы метода:
code — код закрытия (например, 1000
означает нормальное завершение).reason — текстовое описание причины закрытия.Обработчик события onclose позволяет отслеживать причины
разрыва соединения:
socket.oncl ose = (event) => {
console.log(`Соединение закрыто: ${event.code} - ${event.reason}`);
};
WebSocket поддерживает subprotocols, которые указываются при создании соединения. Это позволяет серверу и клиенту согласовывать формат обмена данными:
const socket = new WebSocket('ws://localhost:8080', ['json', 'xml']);
Сервер выбирает один из предложенных протоколов. Если поддержка отсутствует, соединение может быть закрыто.
Событие error информирует о сбоях в соединении:
socket.oner ror = (event) => {
console.error('Ошибка WebSocket', event);
};
Важно помнить, что событие error не содержит детальной
информации о причине, поэтому диагностика обычно выполняется совместно с
onclose.
Поддержание соединения (keep-alive): Для долгоживущих соединений рекомендуется реализовать heartbeat — периодическую отправку ping/pong сообщений для проверки доступности сервера.
setInterval(() => {
if (socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify({ type: 'ping' }));
}
}, 30000);
Переподключение: Если соединение закрыто неожиданно, полезно автоматически пытаться восстановить его с экспоненциальной задержкой.
Структурирование сообщений: Лучше использовать
унифицированный формат сообщений, включающий поля type и
payload. Это облегчает маршрутизацию и обработку данных на
клиенте и сервере.
В современных приложениях WebSocket часто интегрируется с React, Vue или Angular через контекст, store или сервисы. Основные принципы:
wss:// для шифрования трафика.WebSocket обеспечивает эффективную двустороннюю коммуникацию в реальном времени. Понимание состояния соединения, событийного цикла и паттернов управления соединением позволяет создавать стабильные и масштабируемые веб-приложения с минимальной задержкой обмена данными.