我正在构建一个使用socket.io
的javascript套接字应用程序,我是网络编程新手。我不知道在网络中传递数据的最佳方法是什么。我知道传递二进制数据是最有效的方法,但它更复杂。所以我想暂时从普通对象开始。
我之前使用socket.emit('message', obj)
构建了一个聊天应用程序,它的工作原理非常好。但我已经看到一些使用socket.emit('message', JSON.stringify(obj))
传递数据的示例。我不确定这里有什么好处。它是否使网络上传输的数据更小?它比普通对象更有效吗?
答案 0 :(得分:0)
如果您将.emit()
对象作为socket.io中的数据参数传递,它将自动在发送方端调用JSON.stringify()
并自动在接收端调用JSON.parse()
。
所以,你可以传递一个对象,接收器将返回一个对象,socket.io将自动处理它们之间的所有内容。
据我所知,自己调用socket.emit('message', JSON.stringify(obj))
没有任何好处。只需使用socket.emit('message', obj)
即可。它不会更小,更快或更有效。
答案 1 :(得分:0)
默认情况下,您为socket.io will call stringify
,因此手动执行此操作毫无意义。
最有可能的是,简单socket.emit('message', obj)
可以满足您的需求。即使你想要emit binary,也就是它的完成方式。它似乎只是工作",没有太多关于它的文档。基本上,你必须发出通过hasBin
的东西 - 检查即。它必须是Buffer
, ArrayBuffer
, Blob
or File
。
Node.js API中没有Buffer.fromObject
- 方法,原因如此。如果要将Object
作为二进制文件发送,则必须设计如何将其表示为二进制数据。它是否好主意取决于您正在处理的数据类型。如果您的数据主要是字符串,那么您就无法对其进行整理。如果你有很多整数,数字,布尔值等,那么使用二进制文件可能是个好主意,但设计有效的二进制格式需要额外的工作。
此外,还有一种名为BSON的格式。它也有浏览器实现,所以从技术上讲,应该可以将任意Javascript Object
序列化为Buffer
,使用socket.io发送,然后在浏览器中反序列化。我还没有在浏览器环境中使用它:它听起来很有趣,但它需要一些性能测试。