socket.io 中的第二个 io.connection() 不会触发连接事件

second io.connection() in socket.io does not fire connect event

本文关键字:io 连接 事件 第二个 connection socket      更新时间:2023-09-26

我需要灵活地更改客户端连接的服务器。因此,就我而言,客户端如果首先连接到服务器:

var $socket = io.connect("//serverA:5656");

这成功触发了事件代码:

$socket.on('connect', function(data) {
   alert('socket connected with id ' + $socket.id);
});

但是,如果稍后在代码中我需要更改要连接的服务器:

$socket = io.connect("//serverB:8900");

即使 Connect 事件似乎生成了 $socket.id 的新值,但从服务器到此套接字的任何发出都不会通过,也不会触发 CONNECT

我尝试了新服务器连接的几个选项,例如:

$socket.disconnect(true);
$socket = io.connect("//serverB:8900");
$socket.io.reconnect();
$socket.disconnect();
$socket.removeAllListeners('connect');
io.sockets = {};
$socket = io.connect("//serverB:8900");
$socket = io.connect("//serverB:8900", {'forceNew': true});
$socket = io.connect("//serverB:8900", {'force new connection': true});

这些(以及它们的任何组合)都没有成功。

io.connect创建一个新的套接字对象。调用 io.connect("//serverA:5656") 时创建第一个套接字对象。然后,在该套接字上设置connect事件侦听器。

当您调用 io.connect("//serverB:8900") 时,您将创建一个全新的套接字。这个新的套接字对象不知道您之前创建的第一个套接字的任何信息。重要的是,它没有connect事件侦听器。

您需要在第二个套接字对象上再次调用.on('connect', ...),以使其也具有connection侦听器。通常,每次调用io.connection时,都需要对on进行后续调用,以攻击connection监听器。您可以将此操作放在单个函数中以使其更容易:

function makeSocketWithListener(server) {
    var socket = io.connect(server);
    socket.on("connect", function() {
        alert('socket connected with id ' + socket.id);
    });
    return socket;
}

var $socket = makeSocketWithListener("//serverA:5656");

var $socket = makeSocketWithListener("//serverB:8900");