繁体   English   中英

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

[英]Is Socket.io “connect” event even safe to listen to?

我对此一直持怀疑态度。 常见的做法是制作一个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的源代码,并得出了一个结论,即代码上唯一安全的方法是关闭io()autoConnect选项,而不是创建一个自动尝试建立Socket连接,导致任意(“可能不及时”)发出"connect"事件。 这需要手动调用socket.open()但很安全。

这是怎么回事:

  1. io() 创建一个Manager实例调用.socket()

  2. .socket() 创建一个新的Socket实例然后为"connecting""connect"事件绑定Manager自己的内部处理程序(不是用户的)

  3. 由于Socket的构造函数.open()如果为autoConnect ,则涉及立即发出"connecting"事件以及将来发出"connect"事件 ,因此如果使用autoConnect ,则Manager 将手动调用内部的"connecting"事件处理程序

原来是new Socket从来没有等你

我找不到任何安全的小控件(至少在代码方面是如此 ),以防止autoConnect -ing Socket建立"connect" -ion,直到"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);
});

除了“到处理程序附加的代码路径看起来比连接建立的路径看起来更短(“便宜”)之外,是否有充分的理由进行此假设?”这怎么不是竞争条件呢?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM