Socket.IO:重新连接导致服务器连接代码运行两次
Socket.IO: Reconnect Causes Server Connect Code to Run Twice
每当我使用socket.disconnect();
断开连接,然后使用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');
});
}
当客户端连接、断开连接,然后重新连接一次时,上面的代码将生成以下日志:
已连接
客户端发送信息
断开
已连接
客户端发送信息
客户端发送信息
为什么在重新连接时,连接代码会运行两次,但只创建一个连接对象?
编辑:经过进一步检查,当客户端重新连接时,我的另一段连接代码似乎被执行了两次。上述代码已更新,以反映相关信息。
奇怪的是,解决方案完全是客户端的。代替以下代码:
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')
调用。把它们都放在外面。
相关文章:
- Append元素在运行两次函数后不显示
- 我的所有代码在使用Webpack编译时都会运行两次
- JavaScript/JQuery表单验证运行两次
- 若在两个不同的选项卡中打开同一个页面,如何防止javascript运行两次
- jQuery停止函数运行两次
- Socket.IO:重新连接导致服务器连接代码运行两次
- nodejs - 为什么我的异步函数运行两次
- 模板函数在加载网页时运行两次
- 为什么 document.onreadystatechange 运行两次
- 必须在 Firefox 中运行两次 removeChild()
- nodeJs,运行两次sql可以将它们组合成json
- 防止脚本在执行时运行两次
- D3.js键功能在简单的选择器/数组组合上运行两次
- JS运行两次不起作用
- 如何防止 iframe 运行两次加载事件
- ng-重复运行两次(角度)
- Parse.com 云代码 - 保存运行两次后
- Jasmine在同一测试运行两次时失败
- 不明白为什么循环运行两次
- JavaScript事件侦听器运行两次