Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递javascript对象的Socket.io_Javascript_Node.js_Sockets_Socket.io - Fatal编程技术网

传递javascript对象的Socket.io

传递javascript对象的Socket.io,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,Socket.io,我试图用socket.io传递一个javascript对象。 客户端 var cPlanes = {}; //stands for client Planes var plane = new Plane(x, y, z, model, name); //A plane object I made filled with stuff cPlanes[nickname] = plane; //Nickname is defined elsewhere socket.emit("send planes

我试图用socket.io传递一个javascript对象。 客户端

var cPlanes = {}; //stands for client Planes
var plane = new Plane(x, y, z, model, name); //A plane object I made filled with stuff
cPlanes[nickname] = plane; //Nickname is defined elsewhere
socket.emit("send planes", cPlanes);//socket is defined elsewhere too
因此,假设将cPlane对象发送到服务器

服务器端代码在这里

var sPlanes = {}; //stands for server Planes
socket.on("send planes", function(planes){
    sPlanes = planes;
    console.log(planes); //Is where I noticed the problem
});
当我在客户端执行
console.log(cPlanes)
时,我得到

对于想知道的人来说,这是3.js。这是正确的输出,请注意对象的类型是如何为平面的 但是当我从服务器打印出splane时,我得到了这个值,这个值应该等于cplane

它看起来可能是正确的,但它缺少大量的属性。然后我决定试着把它发送回客户端,看看能得到什么

//Server side
io.sockets["in"](socket.room).emit("draw planes", sPlanes);

//Client side
socket.on("draw planes", function(planes){
    cPlanes = planes;
    for(var i in cPlanes){
        console.log(cPlanes);
    }
});
这就是我得到的


注意第一张图片和第三张图片之间的区别。我认为socket.io正在将我的对象转换为其他对象。但我可能在那里的某个地方犯了个愚蠢的错误。我是socket.io和node.js的新手,因此任何帮助都将不胜感激。谢谢:D

当通过socket.io发送对象时,它们被序列化为JSON,而JSON不保留对象的类型或对象的任何方法。它只保留对象的属性

您可以通过添加一个额外的属性来解决这个问题,该属性指示对象的类型,并让接收方将JSON转换为正确的对象类型,但是您必须自己编写代码才能做到这一点

由于您通常不需要发送整个活动对象,因此您可能需要重新考虑要向服务器发送的内容,只需从对象发送一些重要属性,然后在服务器上获取这些属性时,您就会知道它只包含服务器所需信息的子集


在您的特定示例中,cPlane对象中有一堆服务器可能根本不需要的嵌入对象(如
渲染器
对象和
摄影机
对象)因此,您确实应该考虑服务器实际需要哪些属性,并创建一个只包含这些属性的新泛型对象并发送它

例如,您可能希望执行以下操作:

socket.emit("send planes", {x:x, y:y, z:z, name: name});

因为这些似乎是您开始为这个特定对象使用的唯一属性。

像Apache Thrift这样的东西会有所帮助。其思想是在客户端和服务器端保留“类”定义


您可以做的是包装您的类对象。永远不会使用variabke在客户端提示类。然后在服务器端,相应地创建类的新对象。通过套接字在客户机和服务器之间发送的对象实际上是转换成JSON并从JSON中解析出来的,所以您看到的正是JSON的工件。哦,这很有意义。那么有没有办法解决这个问题,或者我必须彻底改变我的结构?你应该只发送最重要的信息。Threejs的对象将包含太多不必要的开销。就像它必须有不能在服务器端使用的功能一样,为什么还要麻烦发送itOk谢谢。真烦人:P