0

我在 NodeJS 中有一个运行 socketIO 的网络游戏。该代码有效,但由于玩家未完全断开连接,导致游戏出现故障。我所说的没有完全断开连接的意思是 - 当移动播放器屏幕锁定他们的手机时,服务器会响应断开连接。这太棒了!但是,客户端不会在他们的手机浏览器中退出网页。出现问题/故障是因为客户端可能会返回浏览器中已加载的网页。服务器感知到这一点并允许他们与游戏交互,但从不触发 io.on 连接功能。玩家自然刷新页面以获取当前游戏状态,服务器统计数据开始调整,因为刷新首先触发 io.on 断开功能,然后触发 io.on 连接功能。这是一个问题,因为在断开连接时,服务器会将 playerCount 负数增加一。最终,通过不完全断开连接,也就是将网页加载到内存中,播放器在连接之前会断开两次连接。这会抛出 playerCount 变量。他们是否有任何明显或明确的解决方案来修复此 socketio 功能?

这里有几行相关代码。

 io.on('connection', function(socket){

   socket.on('newPlayer', function( playerId ){
   playerCount++;
   console.log("a user connected : " + playerCount);

if(playerCount == 1){
  arrayLocationY = location1[0];
  arrayLocationX = location1[1];
}
if(playerCount == 2){
  arrayLocationY = location2[0];
  arrayLocationX = location2[1];

 socket.on('disconnect', function(){
playerCount--;
console.log("user disconnected. Player count is now :" + playerCount);
  });

当断开连接函数被调用两次时,它会抛出 playerCount 导致未来的玩家加载到错误的位置。我猜这个问题正在发生,因为即使服务器断开了它们,已经呈现的 html 页面只是在等待重新连接,因此服务器没有使用 socket.on 连接函数响应。有什么想法吗?

4

1 回答 1

0

用 Javascript 代码处理了这个问题。如果网页选项卡失去焦点,则将用户重定向到另一个页面。因此,当用户返回浏览器时,该页面不再可用。

于 2019-03-13T16:08:16.710 回答