Node.js 房间广播和插座发射-它们是一样的吗?

Node.js 房间广播和插座发射-它们是一样的吗?,node.js,socket.io,Node.js,Socket.io,我在Socket.io中使用我自己的Room实现(有我自己的Room/Player类),因为我需要在Room中执行几个过滤器。现在,我将“players”属性中的所有套接字保存在一个房间中,并实现了我自己的“emit”到房间,将播放器和emit循环到它们的套接字 它比传统的广播慢得多吗?或者它基本上和我对自己的房间实现所做的一样?我的目标是拥有数千个房间,每个房间有2-4名玩家 谢谢:)通过查看,您可以看到,socket.io所做的一切都是在套接字列表上循环,并向每个套接字发送一个数据包(请参见

我在Socket.io中使用我自己的Room实现(有我自己的Room/Player类),因为我需要在Room中执行几个过滤器。现在,我将“players”属性中的所有套接字保存在一个房间中,并实现了我自己的“emit”到房间,将播放器和emit循环到它们的套接字

它比传统的广播慢得多吗?或者它基本上和我对自己的房间实现所做的一样?我的目标是拥有数千个房间,每个房间有2-4名玩家


谢谢:)

通过查看,您可以看到,socket.io所做的一切都是在套接字列表上循环,并向每个套接字发送一个数据包(请参见下面的代码)

因此,如果您的代码正在执行类似的操作,那么性能可能会类似

您可能会注意到一个特性差异,即如果您使用的是自定义适配器(如与集群一起使用的redis适配器),则向连接到不同服务器的用户广播的逻辑将由内置适配器为您处理,但如果您自己进行广播,则可能需要自行实现

以下是socket.io-adapter版本的
.broadcast()

Adapter.prototype.broadcast=函数(数据包、选项){
var房间=opts.rooms | |[];
var except=选择.except | |[];
var flags=opts.flags | |{};
变量packetOpts={
预告:是的,
volatile:flags.volatile,
压缩:flags.compress
};
变量id={};
var self=这个;
无功插座;
packet.nsp=this.nsp.name;
this.encoder.encode(数据包,函数(encodedPackets){
if(房间长度){
对于(变量i=0;i
Adapter.prototype.broadcast = function(packet, opts){
  var rooms = opts.rooms || [];
  var except = opts.except || [];
  var flags = opts.flags || {};
  var packetOpts = {
    preEncoded: true,
    volatile: flags.volatile,
    compress: flags.compress
  };
  var ids = {};
  var self = this;
  var socket;

  packet.nsp = this.nsp.name;
  this.encoder.encode(packet, function(encodedPackets) {
    if (rooms.length) {
      for (var i = 0; i < rooms.length; i++) {
        var room = self.rooms[rooms[i]];
        if (!room) continue;
        var sockets = room.sockets;
        for (var id in sockets) {
          if (sockets.hasOwnProperty(id)) {
            if (ids[id] || ~except.indexOf(id)) continue;
            socket = self.nsp.connected[id];
            if (socket) {
              socket.packet(encodedPackets, packetOpts);
              ids[id] = true;
            }
          }
        }
      }
    } else {
      for (var id in self.sids) {
        if (self.sids.hasOwnProperty(id)) {
          if (~except.indexOf(id)) continue;
          socket = self.nsp.connected[id];
          if (socket) socket.packet(encodedPackets, packetOpts);
        }
      }
    }
  });
};