0Pricing
JavaScript Academy · Урок

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

Обменивайтесь данными с помощью send и onmessage.

«Отправка и получение сообщений» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 4 уроков всего.

Отправка текста

После открытия соединения socket.send(string) передаёт текстовое сообщение серверу.

socket.onopen = () => {
  socket.send("ping");
};

Получение сообщений

onmessage срабатывает для каждого входящего кадра. Данные находятся в event.data.

socket.onmessage = (event) => {
  console.log("Received:", event.data);
};

Форматирование данных в JSON

WebSockets передают необработанные строки. Чтобы отправлять структурированные данные, сериализуйте их с помощью JSON.stringify, а при получении выполните разбор.

socket.send(JSON.stringify({ type: "chat", text: "hi" }));
socket.onmessage = (e) => {
  const msg = JSON.parse(e.data);
  console.log(msg.type, msg.text);
};

Маршрутизация по типу сообщения

Распространённый подход: добавьте поле type и выбирайте обработчик по его значению.

socket.onmessage = (e) => {
  const msg = JSON.parse(e.data);
  switch (msg.type) {
    case "chat": showChat(msg); break;
    case "presence": updatePresence(msg); break;
  }
};

Отправка двоичных данных

send также принимает ArrayBuffer, типизированные массивы и Blob для передачи двоичных данных.

const bytes = new Uint8Array([1, 2, 3, 4]);
socket.send(bytes.buffer);

Получение двоичных данных

При значении binaryType = "arraybuffer" свойство event.data содержит ArrayBuffer, который можно обернуть в типизированный массив.

socket.binaryType = "arraybuffer";
socket.onmessage = (e) => {
  if (e.data instanceof ArrayBuffer) {
    const view = new Uint8Array(e.data);
    console.log(view.length);
  }
};

Управление обратным давлением с помощью bufferedAmount

bufferedAmount сообщает, сколько bytes поставлено в очередь, но ещё не отправлено. Проверяйте это значение перед массовой отправкой в socket, чтобы избежать неограниченного роста потребления памяти.

if (socket.bufferedAmount < 1_000_000) {
  socket.send(payload);
}

Сигналы активности

Периодически отправляйте сообщения проверки связи, чтобы обе стороны знали, что соединение активно, а промежуточные узлы не закрывали неиспользуемые соединения.

setInterval(() => {
  if (socket.readyState === WebSocket.OPEN) {
    socket.send(JSON.stringify({ type: "ping" }));
  }
}, 30000);

Запросы и ответы через WebSocket

Добавляйте идентификатор к исходящим сообщениям и завершайте ожидающее обещание, когда приходит соответствующий ответ.

const pending = new Map();
function request(payload) {
  const id = crypto.randomUUID();
  socket.send(JSON.stringify({ id, ...payload }));
  return new Promise((res) => pending.set(id, res));
}
socket.onmessage = (e) => {
  const msg = JSON.parse(e.data);
  if (pending.has(msg.id)) { pending.get(msg.id)(msg); pending.delete(msg.id); }
};

Постановка в очередь до открытия

Если отправка возможна до открытия socket, сохраняйте сообщения в буфере и отправляйте их в onopen.

const queue = [];
function safeSend(data) {
  if (socket.readyState === WebSocket.OPEN) socket.send(data);
  else queue.push(data);
}
socket.onopen = () => { queue.forEach((d) => socket.send(d)); queue.length = 0; };

Проверка входящих данных

Никогда не доверяйте данным из сети. Оберните JSON.parse в конструкцию try/catch и проверьте структуру данных перед использованием.

socket.onmessage = (e) => {
  let msg;
  try { msg = JSON.parse(e.data); }
  catch { return; }
  if (typeof msg.type !== "string") return;
  handle(msg);
};

Быстрая проверка

Проверьте работу с сообщениями.

Повторение: отправка и получение

Вы отправляли текстовые и двоичные данные, обрабатывали onmessage, представляли данные в формате JSON, выполняли маршрутизацию по типу, отслеживали bufferedAmount для управления обратным давлением, добавили сигналы активности и ставили сообщения в очередь до открытия socket. Далее: жизненный цикл соединения.

Часто задаваемые вопросы

Урок «Отправка и получение сообщений» бесплатный?

Да — полный текст урока «Отправка и получение сообщений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Отправка и получение сообщений»?

Обменивайтесь данными с помощью send и onmessage. Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать JavaScript Academy?

Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Отправка и получение сообщений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке JavaScript Academy?

Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Открытие соединения WebSocket
  2. Отправка и получение сообщений
  3. Жизненный цикл соединения и ошибки
  4. Стратегии повторного подключения
← Назад к JavaScript Academy