ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Исключение отправителя при рассылке сообщений в Socket.io

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Усовершенствуйте работу вашего серверного кода с помощью socket.broadcast из библиотеки socket.io. Этот метод позволяет доставлять сообщения всем подключенным клиентам, исключая отправителя. Ниже представлен пример его использования:

JS
Скопировать код
io.on('connection', (socket) => {
  socket.on('event', (msg) => {
    socket.broadcast.emit('event', msg);
  });
});

Метод socket.broadcast.emit пересылает сообщения всем клиентам, кроме того, кто инициировал отправку.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Рассылка в мультипользовательских комнатах

Для организации онлайн-событий или игр с помощью socket.io можно отправлять сообщения участникам определенных групп, также известных как "комнаты", не включая в переписку отправителя:

JS
Скопировать код
socket.broadcast.to('game').emit('message', 'nice game'); // Вращайся и продолжай игру.

Если же вы хотите включить отправителя в общение и празднование, используйте:

JS
Скопировать код
io.in('game').emit('message', 'cool game'); // Чем больше участников – тем интереснее игра.

Вот как звучит персональное сообщение:

JS
Скопировать код
socket.to('game').emit('message', 'enjoy the game'); // Сообщение для тебя.

Подключите пространство имен, чтобы ограничить круг лиц, имеющих доступ к рассылке:

JS
Скопировать код
io.of('myNamespace').emit('message', 'gg'); // Добро пожаловать в эту зону!

Выбор подходящего инструмента для рассылки

Когда необходимо решить сложную задачу, в арсенале socket.io есть подходящий метод для любой ситуации:

  • Для охвата всех подключенных клиентов используйте io.emit, не забывая про отправителя.
  • Отправляйте менее важные сообщения с помощью socket.volatile.emit.
  • Для повышения производительности и отправки несжатых данных применяйте socket.compress(false).emit.
  • Для работы с клиентами, находящимися на одном серверном узле, используйте io.local.emit.

Высокопрофессиональная рассылка

Отправка сообщений типа «личных» с серверной валидацией

Для того, чтобы отправить персонализированные сообщения, не раскрывая идентификаторы клиентов:

JS
Скопировать код
socket.broadcast.to(socketid).emit('message', 'for your eyes only'); // Только для ваших глаз.

Не забывайте проводить валидацию на стороне сервера перед отправкой сообщений.

Управление волатильной и несущественной рассылкой

Если данные не критически важны и могут быть потеряны:

JS
Скопировать код
socket.volatile.emit('less important message', 'this can be lost'); // Это может быть утеряно.

Этот метод используется для повышения эффективности сетевых операций.

Последние советы от профессионалов

Сохранение данных в области видимости

Важно всегда иметь доступ к объекту socket. Его потеря может привести к ошибкам исполнения или потере сообщений.

Грамотная обработка ошибок

Исключения и ошибки в процессе рассылки должны быть обработаны компетентно. Сервер не должен "упасть" из-за них, словно неловкий официант, уронивший пилюлю.

Оптимизация рассылки

Подготовьтесь к оптимизации рассылки:

  • Управляйте подтверждениями и отслеживанием сообщений, используя socket.emit с callback-функциями.
  • Откажитесь от обработки идентификаторов клиентов на стороне клиента – оставьте эту роль серверу.
  • Комбинируйте разные типы событий и форматы сообщений для эффективной коммуникации.

Визуализация

Представьте ситуацию с вечеринкой и рацией:

Markdown
Скопировать код
Вечеринка: [👩, 👨, 👧, 👦]
Сплетник: 👩 (с рацией)

Сплетник объявляет: "Все собираемся у бассейна! 🏊‍♀️" Но самому себе сообщать ни к чему:

Markdown
Скопировать код
👩: "🏊‍♀️" ➡️ [👨🔊, 👧🔊, 👦🔊]
👩: *молчаливо слушает* 🤫

Все, кроме сплетника, отправляются к бассейну:

Markdown
Скопировать код
Результат: Все направляются к бассейну, в то время как 👩, инициировавшая новость, наблюдает за развитием событий. 🏊‍♀️

Полезные материалы

  1. Излучение событий | Socket.IO – Дополнительная информация о принципе рассылки.
  2. WebSocket API (WebSockets) – Веб API | MDN – Документация по WebSocket API.
  3. javascript – Send response to all clients except sender – Stack Overflow – Практические случаи использования на Stack Overflow.
  4. Socket.IO – Рассылка – Примеры кода, с использованием которых вы сможете улучшить свои навыки.
  5. События | Документация Node.js v21.6.1 – Документация по EventEmitter в Node.js для более глубокого понимания.
  6. Комнаты | Socket.IO – Использование "комнат" при рассылке в Socket.IO.