Отправка данных и закрытие

Учимся слать данные методом send() и корректно закрывать канал.

send() — метод объекта WebSocket, отправляющий данные серверу: строку, бинарный буфер (ArrayBuffer, Blob).

Отправка сообщений

Когда канал открыт, отправка — одна строка:

socket.onopen = () => {
  socket.send("привет, сервер");
};

Чаще всего шлют не голый текст, а структуру — её сериализуют в JSON:

const msg = { type: "chat", text: "привет" };
socket.send(JSON.stringify(msg));

А на приёме разбирают обратно:

socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log(data.type, data.text);
};

Сериализация и разбор — это чистый JS

Сборка и разбор сообщений — обычная работа со строками и объектами, никакого сервера не требует. Вот как могла бы выглядеть мини-функция формирования сообщения чата:

function makeMessage(user, text) {
  return JSON.stringify({
    type: "chat",
    user: user,
    text: text,
    ts: 0
  });
}

const payload = makeMessage("anna", "привет");
console.log(payload);

const back = JSON.parse(payload);
console.log(back.user + ": " + back.text);

Вывод:

{"type":"chat","user":"anna","text":"привет","ts":0}
anna: привет

Закрытие соединения

Когда канал больше не нужен — закрываем:

socket.close();            // обычное закрытие
socket.close(1000, "пока"); // с кодом и причиной

Код 1000 означает «нормальное закрытие». Сервер увидит закрытие и тоже освободит ресурсы.

Как работает под капотом

При send() браузер упаковывает данные в текстовый или бинарный фрейм и отправляет. Если данные не успевают уходить (сеть медленная), они копятся в буфере — его размер виден в socket.bufferedAmount. При close() браузер шлёт специальный close-фрейм; стороны обмениваются ими и закрывают TCP. Коды закрытия стандартизованы: 1000 — норма, 1001 — «ухожу» (вкладка закрыта), 1006 — аварийный обрыв без close-фрейма.

Частые ошибки

  • Слать объект напрямую. send({a:1}) превратит объект в бесполезную строку [object Object] — всегда JSON.stringify.
  • Не следить за bufferedAmount. При лавине данных буфер растёт; для тяжёлого трафика проверяйте его перед отправкой.
  • Считать код 1006 нормальным закрытием. 1006 — это обрыв; обычно повод для реконнекта.

Итоги

  • send() шлёт строку или бинарные данные; структуры передают через JSON.stringify.
  • На приёме разбирают JSON.parse(event.data).
  • close([code, reason]) корректно завершает канал; 1000 — норма, 1006 — обрыв.
  • Сериализация сообщений — обычная работа со строками, не требует сервера.
Проверьте себя
1. Как правильно отправить объект через WebSocket?
Asocket.send(obj)
Bsocket.send(JSON.stringify(obj))
Csocket.write(obj)
Dsocket.emit(obj)
2. Что означает код закрытия 1006?
AНормальное закрытие
BАварийный обрыв без close-фрейма
CЗакрытие по таймауту аутентификации
DСервер перезагружается