Wie konvertiert javascript-array zu Binärdaten und zurück für websocket?
Will ich senden Sie diese Beispiel-array
[{
id: 1,
name: "test",
position: [1234,850], //random position on the map
points: 100 //example points
}];
meiner websocket-server als binäre Daten. Auf server-Seite möchte ich entschlüsseln, dass binäre Daten wieder in ein array, änderungen und zurück zu senden von binären Daten an den client. Und schließlich auf der client-Seite, wie zum Dekodieren von binären Daten wieder in ein array?
Screenshot-Beispiel, was ich meine:
Dies ist meine aktuelle code:
var connection = new WebSocket('wss://my_website.eu:1234');
connection.binaryType = "ArrayBuffer";
connection.onmessage = function (event) {
//console.log(event);
if (event.data instanceof window["ArrayBuffer"]) {
var data3 = JSON.parse(String.fromCharCode.apply(null, new Uint16Array(event.data)));
console.log(data3);
} else {
console.log(event.data); //Blob {size: 0, type: ""}
}
};
$("body").mousemove(function( event ) {
var data = {
name: "lol",
pos: [event.pageX, event.pageY]
};
//convert to binary frame
var data2 = new Uint16Array(data);
console.log(data2); //[]
//try to convert back to array
var data3 = String.fromCharCode.apply(null, new Uint16Array(data2));
console.log(data3); //empty
connection.send(data2); //Binary Frame (Opcode 2, mask) | length: 0
});
Server-side-code:
connection.on('message', function(message) {
for (var i = players.length - 1; i >= 0; i--) {
players[i].connection.send(message.binaryData);
}
});
NEUESTEN BEARBEITEN, LESEN SIE HIER
Kann ich das jetzt Nachricht senden wie binären frame mit der websocket-server. Ich fand Funktionen zu convert string to binary geben und senden Sie es an ws-server.
Nun habe ich problem. Diese Funktionen (siehe unten) funktioniert nicht auf server-Seite. Beispiel-code:
var data = {
name: "value"
};
connection.send(JSON.stringify(data));
Dieser code funktioniert gut. Wenn ich jetzt versuche, zu senden, wie array-Puffer:
var data = {
name: "value"
};
connection.send(StringToArrayBuffer(JSON.stringify(data)));
Ausgang ist nicht Binär-frame, ist nur string "[object ArrayBuffer]":
Ich auch versucht:
connection.send(JSON.stringify(data), {binary: true, mask: false});
aber das senden von Nachrichten als normale string -, nicht binäre Rahmen.
So, wie kann ich senden, Binären Rahmen von websocket-server auf den client? Wenn ich senden Sie zurück erhalten binäre Nachricht:
connection.on('message', function(message) {
for (var i = players.length - 1; i >= 0; i--) {
playerConnection[i].send(message.binaryData);
}
}
nur diese funktioniert.
- mögliche Duplikate von stackoverflow.com/questions/6965107/...
- Habe ich getestet, die funktioniert, und ich habe Fehler. Ich kann nicht analysieren returded JSON-string aus ab2str(). Immer Fehler
[SyntaxError: Unexpected token ]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, Browser behandeln binärer Daten anders als NodeJS. Im browser, die Programme können gesehen werden als
Blob
oderArrayBuffer
, aber in NodeJS, es ist gesehen alsBuffer
nicht verstehenArrayBuffer
. Ich gehe nicht zu tief in diese, aber Sie brauchen, um zu behandelndata
anders zwischen browser und nodeJS.Bei Verwendung der WebSocket-auf der browser-Seite werden Daten übertragen, entweder als string oder Binär, wenn die binären verwendet werden, dann müssen Sie angeben
BinaryType
, und in diesem besonderen Fall, ich werdeArrayBuffer
.Als string zu Puffern, empfehle ich den standard UTF-8, da gibt es 2 Möglichkeiten der Kodierung UTF-16. Zum Beispiel '\u0024' in UTF-16 gespeichert werden, wie 00 24 in UTF-16BE und UTF-16LE, es ist gespeichert als 24 00. Das ist, wenn Sie gehen, um die Verwendung von UTF-16, dann sollten Sie TextEncoder und TextDecoder. Ansonsten können Sie einfach tun dies,
JS:
Für UTF-16, den browser-code sollte so etwas wie:
Auf der server-Seite die Daten gespeichert, die
Buffer
und es mehr oder weniger tut alles nativ. Sie müssen jedoch angeben, Encoding, es sei denn, es ist UTF-8.console.log(JSON.parse(ABToStr(strToAB('{a: "b"}'))));
Sie werden sehen, Fehler...a
muss in einer Klammerconsole.log(JSON.parse(ABToStr(strToAB('{"a": "b"}'))));
jedoch habe ich vergessen zu konvertieren ab uInt8Array in ABToStr.Probieren Sie es aus:
Senden von Daten Beispiel:
Können Sie In Ihrem Ereignis onMessage-websocket-probieren Sie es aus:
{ type: 'binary', binaryData: <Buffer 00> }
. Jetzt konvertieren Sie es zurück an array?else { console.log("test"); }
- und das ist arbeiten. Ich überprüfteconsole.log(event.data)
- Daten.Ereignis ist Blob.Blob {size: 0, type: ""}
. Vor .onmessage-Funktion habe ich line:connection.binaryType = "ArrayBuffer";