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

在生产中,我有一个使用连接局部variables来保持游戏状态的游戏。 但是我注意到,如果我在连接上闲置了一段时间,它断开连接并重新连接,失去当前状态。 在我的本地主机testing期间,我从来没有注意到这种行为。 这是套接字连接的规范行为还是其他的东西导致连接丢失。

如果这是一个正常的行为,通常如何处理? 连接值是否应该全局存储,以便在用户丢弃/重新连接时可以恢复?

你的问题是套接字超时。 如果某个套接字上没有任何活动,则socket.io将自动closures它。

一个简单的方法就是向连接的客户端发送一个心跳,以创build活动并停止套接字超时。

服务器:

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}); }); 

更多信息:

你可以在这里获得更多关于configurationsocket.io的信息。

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

要做到这一点,最好的方法是使用已经广泛使用的方法来存储用户数据,cookie和会话。

关于如何做到这一点的一个非常好的教程位于这里 。 尽pipe他使用express来设置cookie,但是你可以使用任何东西(我使用rails来做)。 使用这种方法,您可以将用户数据存储在cookie中,并在握手期间获取它。 从那里你可以使用socket.handshake.data访问数据。

你需要做的是创build或识别每个(重新)连接的会话。 您可以减less每个Moox的答案上面的重新连接数,但它仍然不是安全的 – 例如,用户丢失了一些无线连接等等。换句话说 – 保持每个会话的用户元数据而不是每个socket,并且期望偶尔断开连接和重新连接。