2014-10-21 11 views
5

Ich versuche, einen Puffer zu meinem Browser über socket.io zu senden. Angeblich wird dies ab 1.0 unterstützt.Problem mit Sendepuffer über Socket.IO

Server Code:

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

Code Auftraggeber:

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

Alles sieht gut aus auf der Client-Seite, außer dass data.buffer ist ein Arraybuffer (kein Puffer) und die Länge ist nicht definiert (der ArrayBuffer scheint nichts zu enthalten).

Fehle ich etwas offensichtlich oder ist es nicht so, wie es funktionieren soll? Danke vielmals!

+1

Die operative Frage ist, ob 'socket.io' wirklich zu handhaben ist ausgestattet Senden und Empfangen von binären Daten? Die Beispiele, die ich gesehen habe, waren immer Strings oder JSON (andere Sachen, die in eine Saite umgewandelt wurden), aber ich weiß nicht, was die Fähigkeiten von 'socket.io' in dieser Hinsicht sind. – jfriend00

+1

Sie können keinen binären Puffer über Socket io senden. Werfen Sie einen Blick auf [BinaryJS] (http://binaryjs.com/) –

+0

Sie könnten Base64 codieren Sie Ihren Puffer und senden Sie diese Zeichenfolge. – jfriend00

Antwort

1

Buffer ist eine Knoten Sache, die Browser nicht native Unterstützung für, aber sie unterstützen typisierte Arrays (besser als eine Puffer-Shim). Daher ist es sinnvoll, einen besseren Container auf der Browserseite zu verwenden.

+0

Und genau, wie Sie vorschlagen, ein typisiertes Array zu senden, wenn 'socket.io' keine Binärdaten akzeptiert? – jfriend00

+0

Socket.IO 1.x unterstützt binäre Daten. – mscdex

+0

Referenz bitte. – jfriend00

3

Es stellte sich heraus, das hat gut funktioniert. Aus irgendeinem Grund erlaubte mir der Buffer nicht direkt darauf zuzugreifen und seine Länge war undefiniert. Die Konvertierung in ein Uint8Array funktionierte perfekt. Ich vermute, dass dies daran liegt, dass socket.io jetzt zwar Buffer-Objekte sendet, es aber keine Garantie gibt, dass Ihr clientseitiges JavaScript weiß, was Sie damit tun sollen.

Dies funktioniert:

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