node.js - node-websocket-server : possible to have multiple, 单独的 "broadcasts"用于单个 node.js 进程?

标签 node.js websocket

我想知道是否可以在从同一个 node-websocket-server 运行的不同 websocket“连接”上进行广播应用实例。想象一个有多个房间的聊天室服务器,仅在单个 node.js 服务器进程上向特定于每个房间的参与者广播消息。我已经成功实现了一个每个进程一个聊天室的解决方案,但我想将它提升到一个新的水平。

最佳答案

您可能想试试 Push-it:http://github.com/aaronblohowiak/Push-It它建立在 Socket.IO 之上。设计遵循巴约协议(protocol)。

但是,如果您需要使用 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});
          }
      }
}

因此,如果您只想将消息中继到特定 channel ,只需维护客户端订阅的所有 channel 的列表即可。这是一个简单的例子(让你开始):

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:

       }
}

收听您应用的 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);
});

希望这会有所帮助。

关于node.js - node-websocket-server : possible to have multiple, 单独的 "broadcasts"用于单个 node.js 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4445883/

相关文章:

javascript - 无法使用 Node js 将错误放入 REST API 中

node.js - 在 Visual Studio Code 中运行 Node http 服务器的步骤

jquery - 加载 URL 并将其传递到 div express.js

c# - 那么... ASP.NET MVC 和 WebSockets?

c++ - 如何使用 POCO 发送 websocket PONG 响应

node.js - Sequelize i18n : errno: 150 "Foreign key constraint is incorrectly formed")

node.js - 如何将 Passport.js 中的 token 存储在本地存储中

amazon-web-services - 为什么使用 Socket.io 时 AWS ALB 会断开连接

websocket - HTTP 网络套接字与 ActiveMQ 网络套接字

java - IBM Websphere v8.5.5.4 : Websocket deployment successful but client not connecting