Как отправить сообщение определённому (одному) клиенту на WebSocket?

В Node.js можно использовать библиотеку ws для работы с WebSocket. Чтобы отправить сообщение определенному клиенту на WebSocket, необходимо иметь некий способ для идентификации этого клиента.

Вот пример простого сервера WebSocket, который отправляет сообщения определенному клиенту:

const WebSocket = require('ws');

// Создание WebSocket-сервера на порту 8080
const wss = new WebSocket.Server({ port: 8080 });

// Словарь для хранения соединения каждого клиента по уникальному идентификатору
const clients = new Map();

// При установлении соединения с клиентом
wss.on('connection', (ws) => {
  // Генерация уникального идентификатора для клиента
  const clientId = generateClientId();
  
  // Сохранение соединения клиента в словаре
  clients.set(clientId, ws);
  
  // При получении сообщения от клиента
  ws.on('message', (message) => {
    // Обработка сообщения
    console.log(`Получено сообщение от клиента ${clientId}: ${message}`);
    
    // Отправка сообщения обратно клиенту
    ws.send(`Привет, клиент ${clientId}! Ты написал: ${message}`);
  });
  
  // При закрытии соединения с клиентом
  ws.on('close', () => {
    // Удаление соединения клиента из словаря
    clients.delete(clientId);
    console.log(`Соединение с клиентом ${clientId} закрыто`);
  });
});

// Функция для генерации уникального идентификатора клиента
function generateClientId() {
  return Math.random().toString(36).substring(2, 8);
}

// Функция для отправки сообщения определенному клиенту
function sendMessageToClient(clientId, message) {
  const ws = clients.get(clientId);
  
  if (ws) {
    ws.send(message);
  } else {
    console.log(`Клиент ${clientId} не найден`);
  }
}

В этом примере мы создаем WebSocket-сервер на порту 8080 и сохраняем соединение каждого клиента в словаре clients с использованием уникального идентификатора. При получении сообщения от клиента мы отправляем это сообщение обратно клиенту. Когда соединение с клиентом закрывается, мы удаляем его соединение из словаря.

Для отправки сообщения определенному клиенту мы можем использовать функцию sendMessageToClient(clientId, message), которая выполняет поиск соединения клиента по его идентификатору в словаре clients. Если клиент найден, мы отправляем сообщение, иначе выводим сообщение об ошибке.

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