我每 30 秒调用一次游戏服务器并收到此响应:
{
name: 'test',
map: 'pool',
maxplayers: 12,
players:
[ { deaths: 0,
kills: '0',
ping: 50,
name: 'test',
score: 0
} ],
}
我怎样才能在 console.log 中记录这样的内容:“${name} 加入了一个服务器!”然后上次调用的数组更改为此例如:
players:
[ { deaths: 0,
kills: '0',
ping: 50,
name: 'test',
score: 0
},
{ deaths: 0,
kills: '0',
ping: 20,
name: 'test2',
score: 0
}
]
我在考虑使用数据库并保存对它的响应,然后与最近调用的新数组进行比较,但我觉得应该有更好的方法来做到这一点。
编辑:
我没有解释我自己的错误,我正在使用“gamedig”npm 模块从战场游戏服务器获取统计数据,我无法访问实际服务器,我只知道 ip。
最佳答案
有很多方法可以解决这个问题,但作为起点,我建议不要每 30 秒轮询一次服务器,如果可以的话,转向更基于事件的系统。轮询本质上并不是邪恶的或任何东西,但它确实可能会长期遇到扩展问题,以及代码维护问题,例如您所描述的问题。
首先,如果您想确保您的客户端不会在游戏过程中突然无法同步,您肯定需要某种数据库来存储游戏状态。否则,任何导致您的服务器端代码重新启动的错误或崩溃都会清除游戏状态,您就倒霉了。您可以从其中的任何一个中进行选择,但我首先会根据您拥有/想要拥有的服务器类型来查看 Redis 或 Firebase 之类的东西。
其次,如果你们都发出事件(例如使用 socket.io)让客户端知道全局游戏状态何时发生变化,并且还将这些事件存储在时间同步的日志中,则可以更轻松地重建未接来电等。这样,如果客户端在一段时间内没有收到更新(一些游戏正是出于这个原因从服务器保持心跳),它可以明确地询问服务器它错过了什么,并获得一组事件自上次已知更新以来发生。最后一点意味着您发送的每条消息都包含一个时间戳,说明它何时有效,因此您可以忽略上次更新之前发生的事情。唯一事件 ID 对于跟踪您已经处理或未处理的事件也非常有用。
编辑
好的,鉴于您没有服务器端可以使用,您的选择真的很有限。我认为最好的办法是转换数据,这样您就可以更轻松地检测到更改,例如基于用户名的哈希:
const users = {
'user1': { deaths: 0, kills: 0, score: 0 }
'user2': { deaths: 1, kills: 5, score: 3000 }
}
然后在服务器的每个响应中,您只需要检查数组中每个用户的存在:
// serverUsers is whatever collection of users you get back in your poll
const newUsers = serverUsers.filter(u => Object.keys(users).includes(u.name));
显然,检测离线玩家是类似的,只是方向相反,您会看到谁在“users”集合中而不在“serverUsers”集合中。
关于javascript - 检测阵列变化的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53705910/