node-websocket-server: possible to have multiple, separate “broadcasts” for a single node.js process?

前端 未结 4 1226
野趣味
野趣味 2020-11-30 16:40

I\'d like to know if it\'s possible to broadcast on different websocket \"connections\" running from the same node-websocket-server app instance. Imagine a chatroom server w

4条回答
  •  生来不讨喜
    2020-11-30 17:24

    You would probably like to try Push-it: http://github.com/aaronblohowiak/Push-It which is built on top of Socket.IO. Design adheres to the Bayeux Protocol.

    However, if you need something that uses redis pubsub you can check http://github.com/shripadk/Socket.IO-PubSub

    Specifically answering your question: You can maintain an array of all the clients connected to the websocket server. And probably just broadcast to a subset of those clients? The broadcast method does essentially that under the hood. node-websocket-server/Socket.IO maintains an array of all the clients connected and just loops through all of them "send"ing a message to each of the clients. Gist of the code:

    // 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});
              }
          }
    }
    

    So if you want to relay messages only to specific channels, just maintain a list of all the channels subscribed by the client. Here is a simple example (to just get you started) :

    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});
             }
          }
    }
    

    To make it even easier use EventEmitters. So in node-websocket-server/Socket.IO see where the messages are being received and parse the message to check the type (subscribe/unsubscribe/publish) and emit the event with the message depending on the type. Example:

    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:
    
           }
    }
    

    Listen to the events emitted in your app's on('connection') :

    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);
    });
    

    Hope this helps.

提交回复
热议问题