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

时间:2012-03-14 19:12:59

标签: node.js socket.io

在制作中,我有一个游戏,它使用连接局部变量来保持游戏状态。但是我注意到如果我在连接上空闲一段时间,它会断开并重新连接,从而失去当前状态。在我对本地主机的测试期间,我从未注意到这种行为。这是套接字连接的规范行为还是导致连接丢失的其他因素。

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

2 个答案:

答案 0 :(得分:24)

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

一个简单(和hackish)修复方法是将心跳发送到连接的客户端以创建活动并停止套接字超时。

服务器:

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访问数据。

答案 1 :(得分:0)

您需要做的是创建或识别每个(重新)连接的会话。您可以减少每个Moox上面的答案重新连接的数量,但它仍然不是故障保护 - 例如一个用户失去了一些wifi连接等等。换句话说 - 每个会话而不是每个插槽维护用户元数据,并期望偶尔断开连接并重新连接。