Socket.io多次触发callback函数

我正在使用node.js和socket.io工作在一个多人游戏canvas游戏中,并且在客户端握手build立后,我的节点服务器立即抛出大量相同的错误。

这是从控制台复制/粘贴:

info - handshake authorized GeDlfwyEdfEIJXGvoZjG new player connected: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 22:3:26 - (onMovePlayer) Player not found: GeDlfwyEdfEIJXGvoZjG 

你可以在这里查看完整的代码: http : //github.com/storrdev/delta-wing

基本上我有一个问题,其中节点控制台server.js(节点脚本)吐出“(OnMovePlayer)Player Not Found: CONNECTION ID ”其中连接ID是连接的客户端的ID。

当服务器收到来自客户端的“移动播放器”消息并且在存储在服务器上的播放器的arrays中找不到播放器的ID时,我会写这个错误消息来显示函数onMovePlayer()。

我不明白的是,服务器甚至不应该调用onMovePlayer()函数,直到客户端发出“移动播放器”消息到服务器,并且客户端不应该发出“移动播放器”消息,直到build立连接,并向服务器发出“新玩家”消息。

为什么这么多次抛出这个错误? socket.emits是否按顺序发送? 我很困惑。

我知道这是复杂的,所以我感谢任何帮助或想法,我可以得到。 我真的希望把这种情况输出来帮助我弄清楚,但不幸的是,事实并非如此。

在game.js的Game.update中有一些问题,它似乎是recursion调用自己。

 if (Game.players[0].update()) { //This seems to execute recursively. socket.emit('move player', {x: Game.players[0].getX(), y: Game.players[0].getY(), angle: Game.players[0].getAngle()}); Game.background.update(Game.players[0].getX(), Game.players[0].getY()); } 

我检查了

 count=0; if (Game.players[0].update()) { socket.emit('move player', {x: Game.players[0].getX(), y: Game.players[0].getY(), angle: Game.players[0].getAngle()}); count +=1; console.log(count); Game.background.update(Game.players[0].getX(), Game.players[0].getY()); } 

我无法通过查看代码来理解逻辑,并判断它是否是正确的行为。 但它不断发送move player请求到服务器。

编辑

经过一些testing,我发现这个问题是由于同步。

当客户端加载页面时,即使在连接到服务器并运行onSocketConnected之前,它也会立即启动move player 。 您在错误控制台上获得的行数等于在Connected to socket server之前发送的消息数量显示在控制台中。 试试我用来debugging的代码。

因此,在连接build立之后,客户不应该放弃“移动播放器”这一假设。 希望这可以帮助你。