我正在制作一款游戏,其中节点服务器使用socket.io与javascript客户端对话。玩家可以连接和断开游戏,服务器会跟踪连接的人。然而,我发现在很多情况下,当我关闭服务器,关闭所有打开的客户端选项卡,然后重新启动一个新的节点服务器,连接的客户端数量似乎不正确。
例如,我将只连接一个客户端,但节点调试器显示服务器正在跟踪三个套接字。
这是一个问题,因为这些孤立的客户端通常会收到来自服务器的消息或超时,这扰乱了服务器上的游戏逻辑(它没有预料到这么多玩家等)
我认为发生这种情况的原因是:1. 套接字中的客户端。IO在断开连接时自动尝试周期性地重新连接2. 关闭选项卡时,与该页关联的套接字由于某种原因没有被"刷新"或清除。3.当服务器关闭然后再次启动时,这些未刷新的客户端认为"哦,服务器已备份,我将尝试重新连接"
如何区分已关闭选项卡/与旧服务器关联的套接字与试图连接新重启的服务器的新客户端之间的区别?或者是否有一种方法可以确保客户端在服务器关闭或选项卡时"刷新"?
没有任何代码,这里我真的只是猜测。http://socket.io/docs/sending-and-receiving-events
上面,你会发现代码,我会复制它。基本上,你需要监听套接字上的'disconnect'事件,并从你用来跟踪客户端的任何数组中删除对客户端的引用。
socket.on('disconnect', function () {
// remove from list here
});
来自浏览器的连接将在选项卡关闭时终止,此事件将在此发生时调用。是的,如果您重新打开页面,它们将重新连接。
你应该创建某种"握手",将客户端添加到你的游戏客户端列表中。任何人都可以从技术上连接到websocket。它可以像发出一个空的"init"消息一样简单,但至少在那里有一些东西。