Socket.IO:重新连接导致服务器连接代码运行两次

每当我断开使用socket.disconnect(); 然后使用socket.connect();重新连接socket.connect(); ,服务器运行我的握手代码两次。 奇怪的是,即使服务器连接代码运行两次,重新连接后,我的数组中只有一个连接。 这发生在意外中断,故意中,或者即使服务器重新启动。 代码位:

 io.on('connection', OnConnect); function OnConnect(socket) { var connection = { socket: socket, realIp: ip, token: GenerateConnToken() }; connections.push(connection); console.log('Connected'); // Client will respond to this by emitting "client-send-info". // This is emitted once on initial connect, but twice on reconnect. socket.emit('acknowledge', connection.token); socket.on('client-send-info', function() { console.log('Client Sent Info'); }); socket.on('disconnect', function() { console.log('Disconnected'); }); } 

上面的代码,当客户端连接,断开,然后重新连接一次,将产生以下日志:

连接的

客户端发送信息

断开的

连接的

客户端发送信息

客户端发送信息

为什么当重新连接时,连接代码会运行两次,但只能创build一个连接对象?

编辑:经过进一步的检查,似乎我的连接代码的另一块正在执行两次客户端重新连接时。 上面的代码被更新以反映相关信息。

奇怪的是,解决scheme完全是客户端。 而不是以下代码:

 var socket = io.connect(); socket.on('connect' function() { socket.on('acknowledge', function() { }); }); 

你必须使用:

 var socket = io.connect(); socket.on('connect' function() { }); socket.on('acknowledge', function() { }); 

否则,当服务器实际上只发送一个时,服务器似乎会发送多个发射,而客户端则错误地接收到多个发射。 使用第二种代码格式,客户端可以成功地初始连接,断开连接并重新连接,而不会收到多个发射。

简单地说,不要在on('connection')调用中放置任何额外的socket.on('x') on('connection')调用。 把它们全部留在它之外。