多年来,我对此一直持怀疑态度。常见的做法是先Socket
,然后然后监听其"connect"
事件。听起来不太安全。
import io from "socket.io-client";
CONNECT: const socket = io(……);
// ← An asynchronous connection establishment might happen here, no?
LISTEN: socket.on("connect", ……);
它会在执行CONNECT
语句后尽快建立连接。如果在之前 LISTEN
之前怎么办?
是什么使这种做法安全使用?我相信,仅仅因为它是两个连续的语句,并不意味着在它们之间不会发生异步连接的建立。我的想法错了吗?
我刚刚阅读了socket.io-client
的源代码,并得出了一个结论:唯一的 code-wise 安全方法是关闭autoConnect
选项io()
不会创建自动尝试建立连接的Socket
,这会导致"connect"
事件的任意(“可能是不及时”)发射。这需要手动调用socket.open()
,但很安全。
这是怎么回事:
.socket()
creates a new Socket
instance和then binds the Manager
's own internal handlers (that is not users') for "connecting"
and "connect"
events。
自Socket
的构造函数.open()
s if autoConnect
(involves the immediate emission of a "connecting"
event和the future emission of a "connect"
event以来,Manager
calls its own internal "connecting"
event handler manually if autoConnect
。
new Socket
从未等你我找不到任何安全的小发明(至少在代码上是 )来阻止autoConnect
-ing Socket
建立"connect"
-直到相应的处理人员挂职。
有趣的是,即使Manager
也会进行这种危险的行为,
Manager.prototype.socket = function (nsp, opts) {
var socket = this.nsps[nsp];
if (!socket) {
socket = new Socket(this, nsp, opts);
this.nsps[nsp] = socket;
var self = this;
socket.on('connecting', onConnecting);
socket.on('connect', function () {
socket.id = self.generateId(nsp);
});
if (this.autoConnect) {
// manually call here since connecting event is fired before listening
onConnecting();
}
}
function onConnecting () {
if (!~indexOf(self.connecting, socket)) {
self.connecting.push(socket);
}
}
return socket;
};
假设Socket
和autoConnect
选项是否为true
,
socket = new Socket(this, nsp, opts);
之前不会进入"connect"
socket.on('connect', function () {
socket.id = self.generateId(nsp);
});
。
除了“连接处理程序的代码路径看起来比连接建立的路径看起来短(“便宜”)之外,还有其他充分的理由进行此假设吗?” 这不是比赛条件?
答案 0 :(得分:0)
您需要一个EventEmitter来附加一个connect
事件,另外,socket.io-client库管理这种情况,请看一下:
https://github.com/socketio/socket.io-client/blob/master/lib/manager.js#L378