当前位置: 首页 > 面试题库 >

node-websocket-server:单个node.js进程可能有多个单独的“广播”吗?

宋稳
2023-03-14
问题内容

我想知道是否可以在从相同的node-websocket-server应用程序实例运行的不同websocket“连接”上进行广播。想象一下一个具有多个会议室的聊天室服务器,它在单个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:

       }
}

监听应用程序的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);
});

希望这可以帮助。



 类似资料:
  • 我在Amazon EC2中有多个应用程序实例,每个实例都运行几个工作进程。我希望每个工作进程都订阅一些通知(例如配置更改)。这个通知基本上应该是广播消息,这样一旦发送,每个工作人员都会收到它。 我知道SQS不支持消息广播。通过查看类似的问题/线索,我看到了使用SNS而不是SQS的建议。由于以下原因,我不确定这是否适用于我: 应用程序实例是自动缩放组的一部分,因此可以动态添加和删除它们。在这种情况下

  • 我正在考虑一个.NET对等应用程序的想法,其中一个对等方使用UDP数据包在子网上通告其存在。然后,任何侦听对等方都将从数据包中获得足够的信息,从而使用TCP建立与广告客户的直接通信通道。 广播数据包似乎需要定向到特定的端口号,并且,为了接收数据包,对等方需要绑定到ipaddress.any上的该端口。 采用这种设计,是否有可能运行绑定到同一NIC的多个对等体?我只得到一个SocketExcepti

  • 给stackoverflow社区的人们。我正在寻找一些帮助,以解决HikariCP连接池面临的问题。 高级:我正在尝试使用线程池创建多个线程,我的计划是为每个工作线程提供独立于HikariCP的连接,但HikariCP所做的是在多个线程之间共享一个公共连接。我正在使用 以检索DB连接。现在,当我关闭一个连接时,我在其他线程中看到问题,说连接关闭了,线程正在处理的批次记录被丢弃。 以下是我的日志文件

  • 首先,我只能使用HTML和/或CSS。我没有能力使用PHP或JavaScript? 我研究了一个iFrame,但我不确定是否有可能有一个带有iFrame的下拉菜单?

  • 问题内容: TableB.TableAID的外键约束。我需要能够允许TableB.TableAID使用来自TableA.ID或TableB.ID的值,因此在单个列上有多个外键约束,我需要它允许或。谢谢! 问题答案: 这是不良设计的明显标志。您永远不需要这样做,如果您这样做,则需要重新考虑设计。 您不能使一个字段与两个不同的FK关联。

  • 问题内容: 我试图创建一个查询,使我可以将联系人的多个电话号码合并到单独的列中。 例如,我想要以下内容 相反是: 尽管这可能是不好的做法,但严格来说,我可以将结果导出到CSV,以便将该数据上传到CRM系统,该系统在导入时不允许任何重复。从那以后,我四处张望,似乎找不到与电话号码相关的答案,并且只允许输入两个而已。 最复杂的部分是数据库的结构,最有可能涉及复杂的查询。这是到目前为止我尝试过的操作,但