Socket.io 断开连接后的恢复

6
我在Socket.io中与服务器和客户端进行了聊天。客户端发送和接收来自服务器的消息。为了测试断开连接事件,我拔掉以太网插头并在几秒钟后重新插上。
之后,从客户端发送消息仍然可以正常工作,并且所有在断开连接期间先前发送的消息都成功地重新发送到Chrome和Firefox。
然而,对于接收方面,在Chrome中是可以的,但是在Firefox中不再接收来自服务器的消息。
问题是我该如何正确处理此类网络问题并使我的聊天功能更加健壮?

你尝试重新连接了吗?例如:socket.on('disconnect', function() { console.log('与服务器断开连接'); window.setTimeout('app.connect()', 5000); }); - Aefits
socket.IO 支持 ACKs(https://socket.io/docs/#Sending-and-getting-data-acknowledgements),您可以使用它来检测数据是否已发送并相应地做出反应。至少这是我处理这种情况的方式。 - Nika
2个回答

2
如文档所述,就像你说的那样,套接字 应该 正常重新连接。由于您可以发送消息,因此似乎已经重新连接了一半。
有几个事件值得添加以查看是否有异常: reconnectingreconnect_attemptreconnectreconnect_errorreconnect_failed
如果没有任何结果,我建议您检查客户端是否收到了断开连接的事件,并重新调用连接函数,这样在网络重新建立后就会获得一个全新的套接字。
socket.on('disconnect', () => {
  // reconnect
})

根据以往的经验,套接字对象中可能存储了一些脏状态,这可能会导致出现您的问题,因此最好使用一个新的干净的套接字对象重新开始。


对于不需要socket-io客户端的人,也有一个小库可以做到这一点,在网络断开时能够优雅地重新连接,并且应该也适用于socket-io后端,该库名为reconnecting-websocket


我在两个浏览器中按以下顺序捕获了以下事件:disconnectreconnect_attemptreconnectingreconnect_errorreconnect_attemptreconnectingreconnect。看起来很好。我如何实现这个 // reconnect?没有它,答案就不完整。 - Gherman
是哪种重新连接,来自服务器还是客户端? - Gherman
至少听取这些事件的建议确实帮助我更好地理解正在发生的事情。 - Gherman

0

我终于找到了问题的根源。Socket.io在重新连接时表现良好,因此您无需尝试重新连接。但是,在成功重新连接后,套接字似乎没有重新加入同一房间。我通过以下方式解决了这个问题:

socket.on('reconnect', () => {
  socket.emit('onEnter', data);
});

这里使用onEnter事件将服务器加入我的房间。 然而,我不明白为什么它不能保留房间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接