Socket.io“连接”事件是否可以安全收听?

时间:2019-01-08 13:02:58

标签: javascript socket.io

多年来,我对此一直持怀疑态度。常见的做法是先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(),但很安全。

这是怎么回事:

  1. io() creates a Manager instancecalls .socket() of it

  2. .socket() creates a new Socket instancethen binds the Manager's own internal handlers (that is not users') for "connecting" and "connect" events

  3. Socket的构造函数.open()s if autoConnectinvolves the immediate emission of a "connecting" eventthe 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;
};

假设SocketautoConnect选项是否为true

socket = new Socket(this, nsp, opts);

之前不会进入"connect"

socket.on('connect', function () {
  socket.id = self.generateId(nsp);
});

除了“连接处理程序的代码路径看起来比连接建立的路径看起来短(“便宜”)之外,还有其他充分的理由进行此假设吗?” 这不是比赛条件

1 个答案:

答案 0 :(得分:0)

您需要一个EventEmitter来附加一个connect事件,另外,socket.io-client库管理这种情况,请看一下:

https://github.com/socketio/socket.io-client/blob/master/lib/manager.js#L378