我正在使用socket.io
构建一个javascript socket应用程序,我是网络编程的新手。我不知道在网络中传递数据的最佳方式是什么。我知道传递二进制数据是最有效的方式,但它更复杂。所以现在我想从普通对象开始。
我以前用socket.emit('message', obj)
构建过一个聊天应用程序,它运行得非常好。但是我看到过一些使用socket.emit('message', JSON.stringify(obj))
传递数据的例子。我不确定它的好处是什么。它是否使网络上传递的数据更小?它是否比普通对象更有效?
3条答案
按热度按时间mspsb9vt1#
默认情况下,socket.io会为您调用
stringify
,因此手动调用是没有意义的。最有可能的是,简单的
socket.emit('message', obj)
能满足你的需要。即使你想发出二进制代码,它也是这样做的。看起来它“只是工作”,没有太多关于它的文档。基本上,你必须发出通过hasBin
检查的代码,也就是说,它必须是Buffer
,ArrayBuffer
,Blob
或File
。在Node.js API中没有
Buffer.fromObject
方法,这是有原因的。如果你想把Object
作为二进制发送,你必须设计如何把它表示成二进制数据。不管是否这样,这是个好主意,取决于你处理的是什么类型的数据。如果你的数据主要是字符串,那么你不能对它进行太多的填充。如果你有很多整数、数字、布尔值等,那么使用二进制可能是个好主意,但是要设计高效的二进制格式需要做很多额外的工作。还有一种叫做BSON的格式,它也有浏览器实现,所以从技术上讲,应该可以将任意的Javascript
Object
序列化为Buffer
,使用www.example.com发送socket.io,然后在浏览器中反序列化,我还没有在浏览器环境中使用过它:这听起来像是个有趣的想法,但它需要一些性能测试。umuewwlo2#
如果您在www.example.com中传递
.emit()
一个对象作为数据参数socket.io,它将在发送端自动调用JSON.stringify()
,并在接收端自动调用JSON.parse()
。所以,你只要传递一个对象,接收器就会返回一个对象,socket.io会自动为你处理这两者之间的所有事情。
据我所知,自己调用
socket.emit('message', JSON.stringify(obj))
并没有什么好处,就用socket.emit('message', obj)
吧,它不会更小或更快或更高效。1mrurvl13#
因为它是一个对象而不是字符串,所以您可以在其他文件中使用该对象,而无需JSON.parse。
它使代码更简单,但就像其他人说的,没有物理上的区别,因为编译器将字符串化它无论如何,也许是一个更小的文件大小的应用程序。