2014-10-21 1 views
5

Sto provando a inviare un buffer al mio browser tramite socket.io. Presumibilmente questo è supportato a partire da 1.0.Problema con buffer di invio su Socket.IO

codice del server:

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

Codice cliente:

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

Tutto sembra buono sul lato client se non che è un data.buffer ArrayBuffer (non un buffer) e la lunghezza non è definito (l'ArrayBuffer non sembra contenere nulla).

Mi manca qualcosa di ovvio o non è come dovrebbe funzionare? Grazie molto!

+1

La questione operativa è se 'socket.io' è davvero in grado di gestire l'invio e la ricezione di dati binari? Gli esempi che ho visto sono sempre stati stringhe o JSON (altre cose trasformate in una stringa), ma non so quali siano le capacità di 'socket.io' in questo senso. – jfriend00

+1

Non puoi inviare un buffer binario sul socket io. Dai un'occhiata a [BinaryJS] (http://binaryjs.com/) –

+0

Potresti codificare il buffer in base64 e inviare quella stringa. – jfriend00

risposta

1

Buffer è un nodo per il quale i browser non dispongono di supporto nativo, ma supportano le matrici tipizzate (meglio di uno shim del buffer). Quindi ha senso usare un contenitore migliore dal lato del browser.

+0

E, esattamente come si propone di inviare una matrice tipizzata se 'socket.io' non accetta i dati binari? – jfriend00

+0

Socket.IO 1.x supporta i dati binari. – mscdex

+0

Riferimento per favore. – jfriend00

3

Risulta che funziona correttamente. Per qualche motivo il Buffer non mi ha permesso di accedervi direttamente e la sua lunghezza era indefinita. La conversione in un Uint8Array ha funzionato perfettamente però. Suppongo che questo sia perché anche se socket.io ora invierà oggetti Buffer, non c'è alcuna garanzia che il tuo javascript sul lato client saprà cosa fare con loro.

Questo funziona:

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