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立之后,客户不应该放弃“移动播放器”这一假设。 希望这可以帮助你。