gpt4 book ai didi

node.js - Socket.io 在服务器端丢失数据

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:26 25 4
gpt4 key购买 nike

黄色,

所以,我正在 Node 上制作一款多人在线游戏(为了好玩),但我已经被一个问题困扰了一个多星期了。也许解决方案很简单,但我没有注意到。长话短说:

  1. 数据从客户端发送到服务器,这 emit每发生一次16.66 毫秒。
  2. 服务器正确接收它们,我们收集所有数据(大量在这种情况下是火球)。我们将它们保存在player.skills_to_execute中数组。
  3. 每 5 秒,我们将数据复制到单独的数组 ( player_information ),因为我们要清理当前的,这样它就可以继续收集新的数据,然后我们将所有收集到的数据发送回客户端。

问题肯定出在服务器端。 有时这有效,有时则无效。 player_information是我从后面发送到前面的数组,但在发送之前,我会检查服务器上的 console.log 是否确实包含数据,确实包含数据!但不知何故,数据在发送之前被删除/覆盖,并且它发送空数组(因为我检查前端并收到空数组)。

代码相当复杂,但我在这里将其最小化,以便更容易理解。

此代码保留在客户端,并按其应有的方式工作:

// front.js
socket.on("update-player-information", function(player_data_from_server){
console.log( player_data_from_server.skills_to_execute );
});

socket.emit("update-player-information", {
skills_to_execute: "fireball"
});

此代码保留在服务器端,并按其应有的方式工作:

// server.js    
socket.on("update-player-information", function(data){

// only update if there are actually skills received
// we dont want every request here to overwrite actual array with empty [] // data.skills_to_execute = this will usually be 1 to few skills that are in need to be executed on a single client cycle
// naturally, we receive multiple requests in these 5 seconds,
// so we save them all in player object, where it has an array for this

if ( data.skills_to_execute.length > 0 ) {
player.skills_to_execute.push( data.skills_to_execute );
}

});

现在这就是代码,在这里,糟糕的事情发生了。

// server.js
// Update player information
setInterval(function(){
// for every cycle, reset the bulk data that we are gona send, just to be safe
var player_information = [];

// collect the data from player
player_information.push(
{
skills_to_execute: player.skills_to_execute
}
);

// we reset the collected actions here, cause they are now gona be sent to front.js
// and we want to keep collecting new skills_to_execute that come in
player.skills_to_execute = [];

socket.emit("update-player-information", player_information);

}, 5000);

也许有人有什么想法?

最佳答案

按值而不是按引用复制数组。

试试这个:

player_information.push(
{
skills_to_execute: player.skills_to_execute.slice()
}
);

在此处了解有关在 JavaScript 中按值或按引用复制数组的更多信息:Copying array by value in JavaScript

关于node.js - Socket.io 在服务器端丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35769707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com