socket.io 1.2.1 如何在重新连接后修复双重事件

Posted

技术标签:

【中文标题】socket.io 1.2.1 如何在重新连接后修复双重事件【英文标题】:socket.io 1.2.1 How to fix double events after reconnect 【发布时间】:2015-03-05 13:04:22 【问题描述】:

在 socket.io 的博客中说,在 1.2.1 版本中

“自述文件修复以防止重新连接时示例中的双重事件 [@nkzawa]”

我为客户端和服务器下载了 1.2.1 版本,但是重新连接后它仍然调用了两次事件。 或者我应该对自述文件做些什么?

我尝试过这种方式重新连接并且它有效,但我可以将它用于生产吗?是正确的方式吗?

socket.disconnect()
// remove socket object
socket = undefined
// connect again
socket = io.connect('forceNew':true)

正如我所说,这是正确的方法还是有缺点?

更新,添加代码

服务器端代码

socket.on('client_emited', function(data)
    socketIO.to('this socket id').emit('server_emitted');
)

客户端代码

var socket;
function connectSocket () 
   if (!socket)
     socket = io('forceNew':true);
   else
     socket.connect();

socket.on('connect', function()
   console.log('CONNECTED TO SOCKET.IO SERVER. SENDING "client_emited" EVENT');
   socket.emit('client_emited');
);
socket.on('server_emited', function()
   console.log('RECEIVED "server_emited" EVENT');
);
socket.connect(); // here console shows 'CONNECTED TO SOCK...' and 'RECEIVED "server_e...' 1 time
socket.disconnect();
socket.connect(); // here console shows 'CONNECTED TO SOCK...' 2 times and 'RECEIVED "server_e...' 4 times time

服务器收到两次“client_emit”事件

【问题讨论】:

问题可能出在创建消息事件处理程序的代码中。您需要确保只调用该代码一次,或者在开始新的事件处理程序之前删除事件处理程序。请向我们展示该代码。 感谢回复,一分钟后显示 先生,我正在更正代码以使其易于理解,它将在 2-3 分钟内完成。虽然你能写下你对第二种方法的看法吗:首先断开连接,删除套接字对象,然后再次连接。可以用吗? 我对第二种方法没有意见(我自己从未尝试过)。这似乎是一种可能会产生其他后果的解决方法,我希望您解决真正的问题。 先生,感谢您的等待,我添加了我的代码 【参考方案1】:

解决办法是:

socket.on('connect', function()....);

改成

socket.once('connect', function()....);

更多信息请阅读issue on github

【讨论】:

以上是关于socket.io 1.2.1 如何在重新连接后修复双重事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Socket.IO 中模拟连接失败

如何从客户端断开和重新连接 socket.io?

如何检测 socket.io 上的断开连接?

当套接字重新连接时,如何让 socket.io 服务器向特定套接字重新发送消息?

如何在 android 上检查 socket.io 连接或断开连接?

socket.io javascript客户端在重新启动服务器后无法重新连接