2014-10-21 166 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); 
});