当前位置: 首页 > 面试题库 >

NodeJS + Socket.io连接丢失/重新连接?

李光华
2023-03-14
问题内容

在生产中,我有一个使用连接局部变量保存游戏状态的游戏。但是,我注意到,如果我在连接上闲置了一段时间,它将断开连接并重新连接,这将丢失当前状态。在本地主机上进行测试时,我从未注意到此行为。这是套接字连接的规范行为,还是导致连接断开的其他原因。

如果是正常行为,通常如何处理?是否应该将连接值全局存储,以便用户断开/重新连接时可以恢复连接值?


问题答案:

您的问题与套接字超时有关。如果某个套接字上没有任何活动,socket.io将自动关闭它。

一个简单的(修正)的方法是向连接的客户端发送心跳以创建活动并阻止套接字超时。

服务器:

function sendHeartbeat(){
    setTimeout(sendHeartbeat, 8000);
    io.sockets.emit('ping', { beat : 1 });
}

io.sockets.on('connection', function (socket) {
    socket.on('pong', function(data){
        console.log("Pong received from client");
    });
}

setTimeout(sendHeartbeat, 8000);

客户:

socket.on('ping', function(data){
      socket.emit('pong', {beat: 1});
    });

更多信息:

您可以在此处获取有关配置socket.io的更多信息。

编辑:马克评论说,如果用户确实失去了连接(由于互联网故障,连接断开了),您应该能够将用户恢复到他的最后状态。

为此,最好的方法是使用一种已经广泛使用的方法来存储用户数据,cookie和会话。

有关如何执行此操作的非常出色的教程位于此处。尽管他使用express来设置cookie,但是您可以使用任何方法(我使用rails来完成)。使用此方法,您可以将用户数据存储在cookie中,并在握手期间将其获取。从那里您可以使用访问数据socket.handshake.data



 类似资料:
  • 问题内容: 我们正在使用 订阅主题。但是,我们经常遇到错误。我已经使用JavaScript客户端(mqttws31.js)测试了连接,效果很好。表示连接没有问题。 错误:- MQTT消息:- 配置 :- pom.xml: 在调试时:- 在上述方法中,有时会抛出。所以基于catch块,它使用 问题答案: 我只是想分享一下,以防万一。…我有相同的异常,并通过确保生成了唯一的客户端ID(使用 )来解决它

  • 问题内容: 我尝试使用nginx设置nodejs。但是当客户端尝试连接时,它将失败并显示… 那么如何启用websocket通信呢? 我目前的Nginx配置 问题答案: 首先,将您的nginx服务器升级到1.3或更高版本。 其次,我的nginx conf有效。您可以关注我的conf。

  • 问题内容: 我有一个问题,如果mySQL Server在“睡眠时间” 500秒后终止了会话,则下一个请求不会成功。如果mySQL Server没有关闭睡眠连接,则可能在700秒后发生相同的问题。 我能做什么?遵循我的persistence.xml的属性 如果重要的话,transactiontype为RESOURCE_LOCAL。 问题答案: 您如何配置连接池?如果它是服务器数据源,则应在服务器中设

  • 问题内容: 用过的 NodeJS,Socket.io 问题 想象有两个用户 U1 和 U2 通过Socket.io连接到应用程序。该算法如下: U1 完全失去Internet连接(例如,关闭Internet) U2 向 U1 发送消息。 U1 尚未收到消息,因为Internet断开 服务器 通过心跳超时检测到 U1 断开连接 U1 重新连接到socket.io U1 从不接收来自 U2 的消息-我

  • NodeJS,socket.io null null 附言。我称之为“消息”的东西不仅仅是可以存储在数据库中的文本消息,而是有价值的系统消息,必须保证交付,否则UI就会出错。 谢了! 我已经有了一个用户帐户系统。而且,我的应用程序已经很复杂了。添加脱机/联机状态没有帮助,因为我已经有了这类东西。问题不一样。 查看步骤2。在这一步上,我们技术上不能说如果U1离线,他只是失去连接,比如说2秒钟,可能是

  • 问题内容: 当我使用节点mysql时,在12:00到2:00之间出现错误,表明服务器已关闭TCP连接。这是完整的消息: 有解决办法。但是,以这种方式尝试后,问题也会出现。现在我不知道该怎么办。有人遇到这个问题吗? 这是我按照解决方案编写的方式: 问题答案: 尝试使用以下代码来处理服务器断开连接: 在您的代码中,我错过了之后的部分