Da Chrome auf Version 14 aktualisiert wurde, ging es von Version drei des Entwurfs zu Version acht des Entwurfs .
Ich habe eine interne Chat-Anwendung, die auf WebSocket läuft, und obwohl ich den neuen Handshake funktioniert habe, hat sich das Daten-Framing anscheinend ebenfalls geändert. Mein WebSocket-Server basiert auf Nugget .
Hat irgendjemand WebSocket mit der Version acht des Entwurfs zu arbeiten und ein Beispiel dafür zu haben, wie man die über die Leitung gesendeten Daten einrahmen kann?
(Siehe auch: How kann ich WebSocket-Nachrichten serverseitig senden und empfangen? )
Es ist ziemlich einfach, aber es ist wichtig, das Format zu verstehen.
Das erste Byte ist fast immer 1000 0001
, wobei 1
"letztes Bild" bedeutet, die drei 0
s sind reservierte Bits ohne Bedeutung und das 0001
bedeutet, dass es ein Textrahmen ist ( welche Chrome mit der Methode ws.send()
sendet.
( Update: Chrome kann jetzt auch binäre Frames mit ArrayBuffer
senden. Die letzten vier Bits des ersten Bytes sind 0002
, Sie können also zwischen Text- und Binärdaten unterscheiden. Die Entschlüsselung der Daten funktioniert genau so.)
Das zweite Byte enthält ein 1
(was bedeutet, dass es "maskiert" (codiert) ist), gefolgt von sieben Bits, die die Rahmengröße darstellen. Wenn es zwischen 000 0000
und 111 1101
liegt, ist das die Größe. Wenn es 111 1110
ist, sind die folgenden 2 Bytes die Länge (weil es nicht in sieben Bits passen würde), und wenn es 111 1111
ist, sind die folgenden 8 Bytes die Länge (wenn sie auch nicht in zwei Bytes passen würde ).
Daran schließen sich vier Bytes an, die die "Masken" sind, die Sie zum Entschlüsseln der Rahmendaten benötigen. Dies geschieht mithilfe der XOR-Codierung, die eine der Masken verwendet, die durch indexOfByteInData mod 4
der Daten definiert sind. Die Dekodierung funktioniert einfach wie encodedByte xor maskByte
(wobei maskByte
ist indexOfByteInData mod 4
).
Nun muss ich sagen, dass ich überhaupt keine Erfahrung mit C # habe, aber das ist ein Pseudocode (etwas JavaScript-Akzent, fürchte ich):
%Vor%Sie können auch die Spezifikation herunterladen, die hilfreich sein kann (sie enthält natürlich alles, was Sie brauchen, um das Format zu verstehen).
Dieser c # Code funktioniert gut für mich. Dekodieren Sie Textdaten, die von einem Browser über einen Socket an einen c # -Server gesendet werden.
%Vor%Um genauer zu sein, Chrome hat sich von der Hixie-76 Version des Protokolls verabschiedet zu der HyBi-10 Version des Protokolls. HyBi-08 bis HyBi-10 melden sich alle als Version 8, da sich nur der Spezifikationstext geändert hat und nicht das Kabelformat.
Das Framing hat sich von der Verwendung von '\ x00 ... \ xff' zu einem 2-7-Byte-Header für jeden Frame geändert, der unter anderem die Länge der Payload enthält. Es gibt ein Diagramm des Rahmenformats in Abschnitt 4.2 der Spezifikation . Beachten Sie auch, dass Daten vom Client (Browser) zum Server maskiert sind (4 Bytes der Client-Server-Frame-Header enthalten den Demaskierungsschlüssel).
Sie können sich websockify ansehen, das ist ein WebSockets zu TCP-Socket-Proxy / Bridge, den ich erstellt habe, um noVNC . Es ist in Python implementiert, aber Sie sollten in der Lage sein, die Idee von der encode_hybi und decode_hybi Routinen.