2012-03-14 239 views
10

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

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

回答

22

你的问题是套接字超时。如果某个套接字上没有任何活动,则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访问数据。

+0

非常聪明的解决方案,谢谢:) – 2012-03-14 20:48:48

+2

这是聪明的解决方案,但它会保持服务器和客户端忙于乒乓:-(任何其他解决方案? – 2013-11-25 09:53:27

0

您需要做的是创建或识别每个(重新)连接的会话。您可以减少上述每个Moox答案的重新连接次数,但它仍然不是安全的 - 例如,用户丢失wifi连接等等。换句话说 - 保持每个会话的用户元数据而不是每个套接字,并且期望偶尔的断开连接和重新连接。

+0

你是对的,我编辑我的问题,考虑到这一点。 – Moox 2012-03-22 16:33:54

+0

我在应用程序中所做的是维护每个会话的用户数据而不是socket.io连接,并管理每个用户连接/断开连接的会话。哪一个顺便提出了为什么socket.io包含每个套接字数据的整个问题 - 我不认为这个特性在socket.io的运行方式中是真正的“兼容”。由于持续的断开/重新连接,试图使用它并放弃它。 – Mark 2012-03-27 07:36:35

相关问题