Socket.io 文档似乎指定了几种向房间中所有连接的客户端发出事件的方法。它们如下:
io.to(),如此处的第一个示例所示:https : //socket.io/docs/server-api/#socket-join-room-callbackio.in(),如在发射备忘单中找到的,在这里找到:https : //socket.io/docs/emit-cheatsheet/socket.to(),如下所示:https : //socket.io/docs/server-api/#socket-to-room除了上面的例子联系起来,既io.to()和io.in()文档中没有列出的其他地方。这些方法究竟有什么作用,我在哪里可以找到有关它们的更多信息?
socket.to()可以在io.on('connection', callback)事件内部使用,如下所示:
io.on('connection', function(socket){
// to one room
socket.to('others').emit('an event', { some: 'data' });
// to multiple rooms
socket.to('room1').to('room2').emit('hello');
});
Run Code Online (Sandbox Code Playgroud)
但是,这没有意义,因为socket传递给此回调的对象表示已连接的客户端。如何使用传入的套接字对象向所有其他连接的套接字广播,如上例所示?
对上述内容的明确解释表示赞赏。
但是,这是没有意义的,因为传递到此回调中的套接字对象代表已连接的客户端。
如果您在调试器中跟踪这些调用,您可以看到发生了什么。
首先,socket.to()在名为的套接字上创建一个属性_rooms,该属性是房间名称的数组。您可以在 Github 存储库的上下文中查看整个代码,但以下是相关部分.to():
Socket.prototype.to =
Socket.prototype.in = function(name){
if (!~this._rooms.indexOf(name)) this._rooms.push(name);
return this;
};
Run Code Online (Sandbox Code Playgroud)
每次连续调用.to()只是向数组添加一个空间。
然后,socket.emit()检查该_rooms属性是否存在,如果存在,则调用它来this.adapter.broadcast(...)获取适配器并告诉它将此消息广播到该适配器上除当前套接字之外的所有套接字。完整代码socket.emit()位于Github 上。代码的特定广播部分是这样的:
if (this._rooms.length || this.flags.broadcast) {
this.adapter.broadcast(packet, {
except: [this.id],
rooms: this._rooms,
flags: this.flags
});
} else {
// dispatch packet
this.packet(packet, this.flags);
}
Run Code Online (Sandbox Code Playgroud)
如何使用传入的套接字对象向所有其他连接的套接字进行广播,如上面的示例所示?
每个套接字都包含对适配器的引用,并且适配器具有该适配器上所有套接字的列表。因此,可以从插座连接到适配器,连接到所有其他插座。
我同意这有点奇怪的功能超载,但他们就是这样做的。我猜他们想让人们访问广播功能,而您所引用的只是一个单独的套接字。
仅供参考,自己真正回答这些类型的未记录问题的唯一方法是查看代码,这无疑是使用开源库的巨大优势之一。我发现获得正确源代码的最快方法是进入调试器中感兴趣的方法。启动调试器,在代码中设置断点,然后单步执行所选函数,它将立即向您显示相关的源代码。如果您想查看它所采取的路径,您可以进一步单步执行该函数。