Что такое WebSocket

HTTP — модель «запрос-ответ»: сервер не может сам отправить данные браузеру. Для живых данных раньше использовали polling (спрашивать каждую секунду), что нагружает сервер и даёт задержку. WebSocket — двустороннее соединение, которое создаётся один раз и остаётся открытым: любая сторона в любой момент отправляет сообщение.

Схемы адресов — ws:// и wss:// (с TLS). Соединение начинается с обычного HTTP-запроса (Upgrade: websocket), сервер отвечает 101 Switching Protocols, и по тому же TCP-соединению начинают идти фреймы.

WebSocket: handshake и сообщения
WebSocket: handshake и сообщения

💡 Если данные идут только от сервера к браузеру, проще Server-Sent Events (EventSource). WebSocket выбирают, когда нужен обмен в обе стороны.


Соединение, события и состояние

Соединение создаётся через new WebSocket(url) и управляется четырьмя событиями. В примере сервер — эхо-сервер (адрес условный, подставьте свой сервер).

javascript
const ws = new WebSocket('wss://echo.example.test/chat');

ws.addEventListener('open', () => {
  console.log('open');
  ws.send('hello');
});

ws.addEventListener('message', (event) => {
  console.log('message:', event.data);
});

ws.addEventListener('close', (event) => {
  console.log('close:', event.code);
});

Состояние соединения лежит в ws.readyState:

ЗначениеКонстантаСмысл
0WebSocket.CONNECTINGИдёт handshake
1WebSocket.OPENГотово, можно отправлять
2WebSocket.CLOSINGВызван close()
3WebSocket.CLOSEDЗакрыто или подключиться не удалось

Событие error не даёт подробностей (из соображений безопасности), за ним всегда следует close; причину показывает event.code.