【发布时间】:2016-07-08 20:01:17
【问题描述】:
我在我的节点服务器上使用Buffer,在我的Javacript客户端上使用Buffer。
为了节省字节,我希望通过 websockets 将我的数据作为二进制而不是 JSON 发送到服务器。
所以,如果我有 [ 5, false, 55, "asdf" ] 的 Javascript 对象,我想在发送之前将其转换为客户端上的缓冲区。也许是这样的:
object.toBuffer('int16', 'bool', 'int16', 'utf8');
并在服务器上读取它,如下所示:
var obj = buffer.read('int16', 'bool', 'int16', 'utf8');
我正在查看当前的解决方案,看起来我可能只需要做很多concating、指定字节偏移/长度、从整数转换为布尔值等。
有没有更好的办法?
编辑:以下是我认为您目前必须这样做的方式。我想我的问题只是它过于冗长且容易出错,我正在寻找一种更简洁优雅的方式来完成它,因为此操作将在我的代码中的许多不同位置执行。
// On client for [ 5, false, 55, "test" ]
const writeFirst = Buffer.allocUnsafe(2);
writeFirst.writeInt16LE(5, 0);
const writeSecond = Buffer.allocUnsafe(1);
writeSecond.writeUInt8(0);
const writeThird = Buffer.allocUnsafe(2);
writeThird.writeInt16LE(55, 0);
const writeFourth = Buffer.from('test');
const result = Buffer.concat([writeFirst, writeSecond, writeThird, writeFourth]);
// On server for reading buffer of [ 5, false, 55, "test" ]
const readFirst = result.readInt16LE(0);
const readSecond = Boolean(result.readUInt8(2));
const readThird = result.readInt16LE(3);
const readFourth = result.toString('utf8', 5);
编辑#2:正在谷歌搜索,我想我可能想要协议缓冲区之类的东西。我不确定它们是什么或者它们是否适用,但看起来你可以在文件中为所有消息指定一个模式,然后将你的 JSON 对象序列化到该模式并让它返回一个缓冲区,然后你可以在客户端/其他服务器上使用相同的模式进行反序列化。我将对此进行更多研究。
【问题讨论】:
-
无论如何,您都必须将 Buffer 转换为 Blob 才能在 Socket 上发送()它,而 gzip 应该负责 JSON 重复,而数组几乎没有。
-
@dandavis:为什么它必须是一个 blob?你不能
connection.binaryType = "arraybuffer";吗? -
嗯,也许吧,我不知道这是一个 Socket 选项,上次我弄脏了,只有 Blob 在我的项目中工作......
-
你试过
Buffer.from([5, false, 55, 'asdf'], 'binary');吗? -
@peteb:我认为这不适用于字符串。
标签: javascript node.js websocket buffer