2014-10-21 75 views
5

我试图通过socket.io向我的浏览器发送缓冲区。据说这从1.0开始支持。通过Socket.IO发送缓冲区问题

Server代码:

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(未缓冲)和长度是不确定的( ArrayBuffer似乎不包含任何东西)。

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

+1

手术的问题是'socket.io'真的有能力处理发送和接收二进制数据的?我见过的例子一直是字符串或JSON(其他东西变成了字符串),但我不知道'socket.io'在这方面的功能是什么。 – jfriend00 2014-10-21 23:44:10

+1

你不能通过socket io发送一个二进制缓冲区。看看[BinaryJS](http://binaryjs.com/) – 2014-10-21 23:52:11

+0

你可以base64编码你的缓冲区并发送该字符串。 – jfriend00 2014-10-22 00:35:02

回答

1

Buffer是浏览器没有本地支持的节点,但它们确实支持Typed Arrays(比Buffer Shim更好)。所以在浏览器端使用更好的容器是有意义的。

+0

而且,如果'socket.io'不接受二进制数据,你究竟该如何建议发送一个类型数组? – jfriend00 2014-10-22 00:35:51

+0

Socket.IO 1.x支持二进制数据。 – mscdex 2014-10-22 00:43:34

+0

请参考。 – jfriend00 2014-10-22 00:44:19

3

原来这工作正常。由于某些原因,Buffer不允许我直接访问它,并且它的长度未定义。将它转换为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); 
});