Создание комнаты в Node.js несколькими методами: подробное руководство

Общение в реальном времени — фундаментальный аспект многих современных веб-приложений. В Node.js WebSocket (WS) — популярный протокол для установления двунаправленных каналов связи между клиентами и серверами. Одним из распространенных вариантов использования является создание «комнат», в которых несколько клиентов могут присоединяться и взаимодействовать друг с другом. В этой статье мы рассмотрим различные методы создания комнат в Node.js с использованием протокола WebSocket, а также приведем примеры кода.

Метод 1: использование массива для хранения подключенных клиентов

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
const rooms = {};
wss.on('connection', (ws) => {
  ws.on('message', (message) => {
    const { room, data } = JSON.parse(message);
    if (rooms[room]) {
      rooms[room].forEach((client) => {
        client.send(data);
      });
    }
  });
  ws.on('close', () => {
    // Remove the client from the room
    Object.keys(rooms).forEach((room) => {
      rooms[room] = rooms[room].filter((client) => client !== ws);
    });
  });
});

Метод 2. Использование карты для управления помещениями

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
const rooms = new Map();
wss.on('connection', (ws) => {
  ws.on('message', (message) => {
    const { room, data } = JSON.parse(message);
    if (rooms.has(room)) {
      const clients = rooms.get(room);
      clients.forEach((client) => {
        client.send(data);
      });
    }
  });
  ws.on('close', () => {
    // Remove the client from the room
    rooms.forEach((clients) => {
      rooms.set(room, clients.filter((client) => client !== ws));
    });
  });
});

Метод 3. Реализация управления комнатами с помощью Redis

const WebSocket = require('ws');
const redis = require('redis');
const wss = new WebSocket.Server({ port: 8080 });
const rooms = {};
const redisClient = redis.createClient();
wss.on('connection', (ws) => {
  ws.on('message', (message) => {
    const { room, data } = JSON.parse(message);
    redisClient.lrange(room, 0, -1, (err, clients) => {
      clients.forEach((client) => {
        wss.clients.forEach((wsClient) => {
          if (wsClient !== ws && wsClient.readyState === WebSocket.OPEN) {
            wsClient.send(data);
          }
        });
      });
    });
  });
  ws.on('close', () => {
    // Remove the client from the room
    Object.keys(rooms).forEach((room) => {
      rooms[room] = rooms[room].filter((client) => client !== ws);
    });
  });
});

Создание комнат в Node.js с использованием протокола WebSocket открывает потрясающие возможности для общения в реальном времени в веб-приложениях. В этой статье мы рассмотрели несколько методов реализации функциональности помещений, включая использование массивов, карт и интеграцию Redis для управления помещениями. Каждый метод имеет свои преимущества и особенности, поэтому выберите тот, который лучше всего подходит для вашего конкретного случая использования. Используя эти примеры кода, вы можете легко реализовать функциональность комнаты и расширить возможности приложений Node.js, работающих в режиме реального времени.