在生产环境中,我有一个游戏使用连接本地变量来保存游戏状态。然而,我注意到如果我在连接上闲置一段时间,它会断开并重新连接,从而丢失当前状态。在我的本地主机上进行测试时,我从未注意到这种行为。这是否是套接字连接的正常行为,还是其他因素导致连接断开。
如果这是正常行为,通常应该如何处理?连接值应该全局存储,以便在用户断开/重新连接时可以恢复吗?
如果这是正常行为,通常应该如何处理?连接值应该全局存储,以便在用户断开/重新连接时可以恢复吗?
你的问题与套接字超时有关。如果某个套接字上没有任何活动,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的更多信息:这里。
编辑:Mark评论说,如果用户失去连接(因为互联网问题导致连接中断),您应该能够将用户恢复到上次的状态。
为了达到这个目的,最好使用存储用户数据的广泛使用的方法之一,即Cookie和Session。一个非常好的教程在这里,虽然他使用Express来设置Cookie,但您可以使用任何东西来实现它(我使用Rails)。使用此方法,您可以将用户数据存储在Cookie中,并在握手期间获取它。从那里,您只需使用socket.handshake.data
访问数据即可。
pingTimeout
和pingInterval
分别为60秒和25秒。 - Pauloco