【问题标题】:room broadcast vs sockets emit - are they the same?房间广播与套接字发射 - 它们是一样的吗?
【发布时间】:2016-10-17 18:48:18
【问题描述】:

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

比传统的broadcast.to('room')慢很多吗?或者它基本上做了我对自己的房间实施所做的事情?我的目标是拥有数千个房间,每个房间有 2-4 名玩家......

谢谢:)

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    正如您通过查看the code for the socket.io adapter .broadcast() on GitHub 所看到的,socket.io 所做的只是遍历一个套接字列表并向每个套接字发送一个数据包(参见下面的代码)。

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

    您可能会注意到功能差异的地方是,如果您使用的是自定义适配器,例如与集群一起使用的 redis 适配器,那么向连接到不同服务器的用户广播的逻辑将由内置的适配器,但如果您自己进行广播,则可能需要自己实现。

    这是.broadcast() 的socket.io-adapter 版本:

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

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      相关资源
      最近更新 更多