在制作中,我有一个使用连接局部变量来保持游戏状态的游戏。但是我注意到,如果我在连接上空闲了一段时间,它会断开并重新连接,从而失去当前状态。在本地主机测试期间,我从未注意到这种行为。这是套接字连接的规范行为还是其他因素导致连接丢失。NodeJS + Socket.io连接丢失/重新连接?
如果这是一个正常的行为,通常如何处理?连接值应该全局存储,以便在用户放弃/重新连接时可以恢复它们?
在制作中,我有一个使用连接局部变量来保持游戏状态的游戏。但是我注意到,如果我在连接上空闲了一段时间,它会断开并重新连接,从而失去当前状态。在本地主机测试期间,我从未注意到这种行为。这是套接字连接的规范行为还是其他因素导致连接丢失。NodeJS + Socket.io连接丢失/重新连接?
如果这是一个正常的行为,通常如何处理?连接值应该全局存储,以便在用户放弃/重新连接时可以恢复它们?
你的问题是套接字超时。如果某个套接字上没有任何活动,则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 here.
编辑的详细信息:马克评论说,如果用户确实失去了连接(连接掉线了结束因为网络问题),你应该能够恢复用户到他的最后一个状态。
要做到这一点,最好的方法是使用已广泛使用的方法来存储用户数据,cookie和会话。
一个非常好的教程,如何做到这一点located here。尽管他使用express来设置cookie,但可以使用任何东西(我使用rails来做)。使用这种方法,您可以将用户数据存储在cookie中并在握手期间获取它。从那里你可以使用socket.handshake.data
访问数据。
您需要做的是创建或识别每个(重新)连接的会话。您可以减少上述每个Moox答案的重新连接次数,但它仍然不是安全的 - 例如,用户丢失wifi连接等等。换句话说 - 保持每个会话的用户元数据而不是每个套接字,并且期望偶尔的断开连接和重新连接。
非常聪明的解决方案,谢谢:) – 2012-03-14 20:48:48
这是聪明的解决方案,但它会保持服务器和客户端忙于乒乓:-(任何其他解决方案? – 2013-11-25 09:53:27