javascript - Socket.io 传递 javascript 对象

标签 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", 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) 时,我得到了这个

enter image description here

three.js 适合好奇的人。这是正确的输出,请注意对象的类型是 Plane 但是当我从服务器打印出 sPlanes 时,它应该等于 cPlanes,我明白了。

enter image description here

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

//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);
    }
});

这就是我得到的。

enter image description here

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

最佳答案

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

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

由于您通常不需要发送整个事件对象,您可能需要重新考虑要发送到服务器的内容,只需发送对象的一些重要属性,然后当您在服务器上获取这些属性时,您会知道它只是服务器所需信息的一个子集。


在您的具体示例中,cPlane 对象中有一堆嵌入式对象,服务器可能根本不需要这些对象(例如 renderer 对象和 camera object) 所以你真的应该考虑服务器实际需要哪些属性并创建一个只包含这些属性的新通用对象并发送它。

例如,您可能想这样做:

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

因为这些似乎是您开始时针对该特定对象使用的独特属性。

关于javascript - Socket.io 传递 javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30550076/

相关文章:

c++ - 最适合即时消息客户端的异步套接字模型?

php - 在 PHP 中从套接字流中读取单个字节

javascript - JQuery Mobile 错误

javascript - 如何在 JS 中运行并发 promise ,然后在没有 Promise.all() 的情况下等待它们完成?

javascript - 如何传递 Prop 服务器端 react

node.js - Node JS 存储过程字段值返回为未定义

javascript - 带有 NestJS + Typescript + Webpack + node_modules 的单个文件包

c# - .Net C# TcpClient/Socket HTTP 客户端性能/效率

javascript - HTML 表单操作在第一个按钮上触发

JavaScript 按 data.length 追加元素