Node.js 房间广播和插座发射-它们是一样的吗?
我在Socket.io中使用我自己的Room实现(有我自己的Room/Player类),因为我需要在Room中执行几个过滤器。现在,我将“players”属性中的所有套接字保存在一个房间中,并实现了我自己的“emit”到房间,将播放器和emit循环到它们的套接字 它比传统的广播慢得多吗?或者它基本上和我对自己的房间实现所做的一样?我的目标是拥有数千个房间,每个房间有2-4名玩家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所做的一切都是在套接字列表上循环,并向每个套接字发送一个数据包(请参见下面的代码) 因此,如果您的代码正在执行类似的操作,那么性能可能会类似 您可能会注意到一个特性差异,即如果您使用的是自定义适配器(如与集群一起使用的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);
}
}
}
});
};