【问题标题】:Issue with sending buffer over Socket.IO通过 Socket.IO 发送缓冲区的问题
【发布时间】:2014-10-24 01:34:19
【问题描述】:

我正在尝试通过 socket.io 向我的浏览器发送一个缓冲区。据说这是从 1.0 开始支持的。

服务器代码:

var tempBuffer = new Buffer(10);
for (var i=0; i<10; i++) {
    tempBuffer[i] = i;
}
io.sockets.emit('updateDepth', { image: true, buffer: tempBuffer });

客户端代码:

socket.on('updateDepth', function(data) {
    console.log("update depth: " + data.buffer + ", " + data.buffer.length);
});

除了 data.buffer 是一个 ArrayBuffer(不是 Buffer)并且长度未定义(ArrayBuffer 似乎不包含任何内容)之外,一切在客户端看起来都不错。

我是否遗漏了一些明显的东西,或者这不是它应该如何工作的?非常感谢!

【问题讨论】:

  • 实际问题是socket.io 是否真的具备处理二进制数据的发送和接收的能力?我看到的例子一直是字符串或者JSON(其他东西变成字符串),但是我不知道socket.io在这方面的能力是什么。
  • 您不能通过套接字 io 发送二进制缓冲区。看看BinaryJS
  • 您可以对缓冲区进行base64编码并发送该字符串。

标签: node.js socket.io


【解决方案1】:

事实证明这工作正常。由于某种原因,缓冲区不允许我直接访问它,并且它的长度未定义。不过,将其转换为 Uint8Array 效果很好。我猜这是因为即使 socket.io 现在将发送 Buffer 对象,也不能保证您的客户端 javascript 会知道如何处理它们。

这确实有效:

socket.on('updateImg', function(data) {
    var imgArray = new Uint8Array(data.buffer);
    console.log("update img: " + data.buffer + ", " + data.buffer.length);
});

【讨论】:

    【解决方案2】:

    Buffer 是浏览器本身不支持的节点事物,但它们确实支持类型化数组(比缓冲区 shim 更好)。所以在浏览器端使用更好的容器是有意义的。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多