Отправка данных и закрытие
Учимся слать данные методом 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 — обрыв.- Сериализация сообщений — обычная работа со строками, не требует сервера.