node-websocket-server: возможно иметь несколько отдельных «трансляций» для одного процесса node.js?

Я хотел бы узнать, можно ли транслировать на разных веб-соединениях «соединения», запущенных из одного и того же экземпляра приложения node-websocket-server . Представьте себе сервер чата с несколькими комнатами, только передавая сообщения участникам, специфичным для каждой комнаты, на одном сервере node.js. Я успешно реализовал одночасовое решение для каждого процесса, но хочу перейти на следующий уровень.

Вероятно, вам захочется попробовать Push-it: http://github.com/aaronblohowiak/Push-It, который построен поверх Socket.IO. Конструкция придерживается протокола Байе.

Однако, если вам нужно что-то, что использует redis pubsub, вы можете проверить http://github.com/shripadk/Socket.IO-PubSub

В частности, отвечая на ваш вопрос: вы можете поддерживать массив всех клиентов, подключенных к серверу websocket. И, возможно, просто передается подмножество этих клиентов? Метод широковещания в основном делает это под капотом. node-websocket-server / Socket.IO поддерживает массив всех подключенных клиентов и просто проходит через все из них «отправляет» сообщение каждому из клиентов. Суть кода:

// considering you storing all your clients in an array, should be doing this on connection: clients.push(client) // loop through that array to send to each client Client.prototype.broadcast = function(msg, except) { for(var i in clients) { if(clients[i].sessionId !== except) { clients[i].send({message: msg}); } } } 

Поэтому, если вы хотите передавать сообщения только по определенным каналам, просто поддерживайте список всех каналов, подписанных клиентом. Вот простой пример (только для начала):

 clients.push(client); Client.prototype.subscribe = function(channel) { this.channel = channel; } Client.prototype.unsubscribe = function(channel) { this.channel = null; } Client.prototype.publish = function(channel, msg) { for(var i in clients) { if(clients[i].channel === channel) { clients[i].send({message: msg}); } } } 

Чтобы еще проще использовать EventEmitters. Таким образом, в node-websocket-server / Socket.IO видят, где принимаются сообщения, и анализируют сообщение, чтобы проверить тип (подписаться / отписаться / опубликовать) и испустить событие с сообщением в зависимости от типа. Пример:

 Client.prototype._onMessage = function(message) { switch(message.type) { case 'subscribe': this.emit('subscribe', message.channel); case 'unsubscribe': this.emit('unsubscribe', message.channel); case 'publish': this.emit('publish', message.channel, message.data); default: } } 

Слушайте события, которые вы выбрали в приложении («соединение»):

 client.on('subscribe', function(channel) { // do some checks here if u like client.subscribe(channel); }); client.on('unsubscribe', function(channel) { client.unsubscribe(channel); }); client.on('publish', function(channel, message) { client.publish(channel, message); }); 

Надеюсь это поможет.

Я не уверен, что комнаты были особенностью, когда были созданы другие ответы, но в документации у них есть функция именно того, что вы ищете. Поэтому перейдите по этой ссылке и ищите rooms .

Вот пример с сайта:

 var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.join('justin bieber fans'); socket.broadcast.to('justin bieber fans').emit('new fan'); io.sockets.in('rammstein fans').emit('new non-fan'); }); 

Основываясь на других ответах, это было больше сосредоточено на масштабировании, я хотел бы получить некоторое представление, если встроенная версия масштабируется так же, как и предлагаемые ответы.

Ответ Шрипада К очень хорошо структурирован. Отличная работа.

Я думаю, что решение будет иметь некоторые проблемы масштабирования, хотя.

Если у вас было 10000 одновременных пользователей в 500 чатах, то каждый раз, когда любой пользователь отправил сообщение, вам нужно было бы перебрать все 10 000 клиентов. Я подозреваю, что быстрее будет хранить список клиентов в данной комнате в структуре redis и просто захватить этот список и отправить этим клиентам.

1) Не уверен, что это быстрее. 2) Не уверен, что можно было бы сохранить в redis, что позволило бы нам ссылаться на клиентов. Может быть, может быть хеш всех клиентов на сервере, с помощью уникального идентификатора и в redis, мы могли бы просто сохранить набор идентификаторов пользователя в чате?

Является ли это более масштабируемым?

Я написал узел чат-сервера на основе fzysqr и вам нужно сделать его масштабируемым для нескольких чатов, прежде чем выкладывать его широко.

С комнатами мой простой тестовый чат выглядит так:

chat.js:

 var app = require('http').createServer(handler) , io = require('socket.io').listen(app) , fs = require('fs') app.listen(80); function handler (req, res) { fs.readFile(__dirname + '/chat.html', function (err, data) { if (err) { res.writeHead(500); return res.end('Error loading chat.html'); } res.writeHead(200); res.end(data); }); } io.sockets.on('connection', function (socket) { socket.on('join', function (room) { if (Array.isArray(room)) { var i; for (i = 0; i < room.length; ++i) { console.log('join room ' + room[i]); socket.join(room[i]); } } else if (typeof room === 'string') { console.log('join room ' + room); socket.join(room); } }); socket.on('leave', function (room) { if (typeof room === 'string') { console.log('leave room ' + room); socket.leave(room); } }); socket.on('post', function (data) { io.sockets.in(data.room).emit('publish', data); }); }); 

и chat.html:

   Node js test      

Node js test


















  • Вызывает усталость HTTP / 2?
  • Каковы подводные камни использования Websockets вместо RESTful HTTP?
  • Различия между socket.io и websockets
  • Зачем использовать AJAX, когда доступны WebSockets?
  • Готовый сервер для создания WebSockets в Java?
  • Как использовать Tomcat 8 в Eclipse?
  • Отладка веб-браузера Chrome Web Inspector
  • Протокол WebSockets vs HTTP
  • Как получить доступ к экземплярам WebSockets в Jetty 9?
  • Есть ли клиент WebSocket для .NET?
  • Различия между сокетами TCP и веб-сокетами, еще раз
  • Interesting Posts

    Сколько соединений сокетов может обрабатывать веб-сервер?

    Синхронизация хрома без учетной записи google

    Как скопировать Ctrl-p в стрелку вверх с помощью xmodmap?

    Нажмите программную кнопку «Уведомление»

    Как сделать заявление оператора C # использовать IgnoreCase

    Почему проверка Windows Update настолько медленная?

    Отслеживать количество «просмотров страниц» или «ударов» объекта?

    Построение звука в реальном времени, звуковые эффекты, Ubuntu 10.04

    Получить информацию о пользователе через API Google

    Почему ярлык, который отображается на рабочем столе, не отображается, когда мы входим в User> Desktop

    Команда запуска приложения с правами администратора, но не администратор AS (приглашение с UAC)

    Расseleniumие изображения UIImageNamed: FUD

    Использование камеры в эмуляторе Android

    Загрузите программу установки для старой версии Git

    Частные и общественные участники на практике (насколько важно инкапсуляция?)

    Давайте будем гением компьютера.