Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

WebSocket в Node.js: отправка сообщений конкретному клиенту

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

Для отправки сообщений через WebSocket определенному пользователю вам нужно создать словарь, который будет связывать идентификатор этого пользователя (userID) с его WebSocket. При установлении соединения каждый пользователь соответствует своему собственному WebSocket, что позволит вам в дальнейшем отправлять сообщения нужному пользователю непосредственно через его WebSocket.

JS
Скопировать код
const wss = new WebSocket.Server({ port: 8080 });
const userSockets = {}; // Словарь сопоставляющий пользователя и его сокет

wss.on('connection', (ws) => {

  let userID; // Идентификатор сокета пользователя

  ws.on('message', (message) => {
    const { type, id, text } = JSON.parse(message);
    if (type === 'register') {
      userID = id; // Сохраняем ассоциацию идентификатора пользователя
      userSockets[userID] = ws; // Привязываем сокет к пользователю
    }
  });

  ws.on('close', () => {
    delete userSockets[userID]; // При отключении удаляем сокет пользователя из словаря
  });
});

function sendToUser(id, text) {
  const ws = userSockets[id];
  if (ws) ws.send(text); // Отправляем сообщение через сокет пользователя
}

Для отправки сообщения пользователю воспользуйтесь функцией sendToUser('userID', 'message'), где 'userID' – это идентификатор пользователя.

Кинга Идем в IT: пошаговый план для смены профессии

Устойчивость и производительность системы

Уникальные идентификаторы

Используйте уникальные идентификаторы (UIDs) для WebSocket соединений для повышения безопасности и для гарантии доставки сообщений каждому из пользователей.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Надежная аутентификация и гарантия конфиденциальности

Применяйте токены аутентификации, чтобы обеспечить целостность данных и защитить конфиденциальность. Используйте зашифрованное подключение WSS при обмене данными и верифицируйте пользователей, чтобы предотвратить Несанкционированный доступ.

Хранение сообщений

Сохраните все важные сообщения в базе данных для предотвращения их потери и для обеспечения возможности поиска.

Надежные серверные механизмы

Безопасность потоков данных и возможности масштабирования

ConcurrentDictionary в .NET, как пример конкурентной коллекции, поможет обеспечить безопасность потоков данных и управление большим числом подключений от клиентов.

Маршрутизация запросов

В таких библиотеках как ws (версии 3 и выше), полезно реализовать извлечение userID из URL запросов, прикрепленных к событию подключения.

Отслеживание активных подключений

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

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

Здесь как схематическое представление отправки сообщения конкретному пользователю через WebSocket:

Markdown
Скопировать код
Сервер WebSocket
|
|----> 🌍 Все пользователи (Массовая рассылка)
|
|----> 👤 Определенный пользователь (Персональное сообщение)

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

Markdown
Скопировать код
📬 Почтовое отделение (Сервер WebSocket)
|
|----> 📰 Рекламные брошюры (для всех 🌍)
|
|----> ✉️ Личное письмо (для конкретного 👤)

Главный упор делается на безопасность, конфиденциальность и индивидуальность подключения пользователя.

Создание передовой системы обмена сообщениями

Личные сообщения

Для организации приватных диалогов используйте словарь сопоставлений пользователей и их WebSocket-соединений. Это обеспечит конфиденциальность общения.

Интеграция на клиентской стороне

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

JS
Скопировать код
// Слушаем сообщения
const socket = new WebSocket('ws://localhost:8080');

socket.addEventListener('message', function (event) {
  console.log('Message from server', event.data); // Сообщение получено
});

// При установке соединения мы регистрируемся
socket.addEventListener('open', function (event) {
  socket.send(JSON.stringify({ type: 'register', id: 'uniqueUserID' })); // Запрос на регистрацию в системе
});

Использование "wscat" для тестирования

Wscat — это утилита командной строки для тестирования WebSocket-соединений. Она полезна при отладке и тестировании серверов.

Изучение библиотек и усовершенствование WebSocket

Отбор наиболее подходящих библиотек

Изучивайте такие библиотеки как socket.io, ws или WebSockets, чтобы в полной мере воспользоваться возможностями WebSocket.

Расширенные серверы WebSocket

Настройте серверы так, чтобы они поддерживали сжатие данных, передачу бинарных данных и мультиплексирование. Это обеспечит высокую производительность даже при больших нагрузках.

Масштабирование с использованием архитектур

Изучите архитектуры, которые позволяют масштабировать систему с использованием балансировщиков нагрузки или брокеров сообщений.

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

  1. Веб-сокеты API (WebSockets) – Веб API | MDN — подробное руководство и справочник по WebSockets в веб-разработке.
  2. Знакомство с WebSockets – Внедрение сокетов в веб | web.dev — статья с базовыми знаниями о WebSockets.
  3. Отправка ответов всем клиентам, кроме отправителя – Stack Overflow — дискуссионный форум с примерами решения задачи адресной доставки сообщений.
  4. Стандарт WebSockets — официальная спецификация WebSockets для специалистов, которые заинтересованы в технических деталях.
  5. RFC 6455 – Протокол WebSocket — основной стандарт протокола WebSocket, описывающий передачу данных.
  6. Использование WebSocket для создания интерактивного веб-приложения | Spring — руководство по использованию Spring и WebSockets для создания веб-приложений.
  7. Шпаргалка по отправке сообщений | Socket.IO — шпаргалка по отправке сообщений определенному пользователю с помощью Socket.IO на Node.js.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как связать идентификатор пользователя с его WebSocket?
1 / 5