Общение в реальном времени — фундаментальный аспект многих современных веб-приложений. В 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, работающих в режиме реального времени.