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

时间:2016-03-08 14:24:58

标签: javascript node.js socket.io

我需要动态地更改客户端连接的服务器。因此,在我的情况下,客户端首先连接到服务器:

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

这会成功触发事件代码:

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

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

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

即使它似乎为$ 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});

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

1 个答案:

答案 0 :(得分:0)

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");