(Véase también: How can I send and receive WebSocket messages on the server side?)
Es bastante fácil, pero es importante entender el formato.
El primer byte es casi siempre 1000 0001
, donde el 1
significa "último fotograma", los tres 0
s se reservan los bits sin ningún significado hasta el momento y la 0001
significa que se trata de un marco de texto (que Chrome envía con el método ws.send()
)
(Actualización:.. Chrome ahora también puede enviar cuadros binarios con un ArrayBuffer
Los últimos cuatro bits del primer byte serán 0002
, por lo que puede variar entre el texto y datos binarios La descodificación de los datos funciona exactamente de la De la misma manera.)
El segundo byte contiene un 1
(lo que significa que está "enmascarado" (codificado)) seguido de siete bits que representan el tamaño del fotograma. Si está entre 000 0000
y 111 1101
, ese es el tamaño. Si es 111 1110
, los siguientes 2 bytes son la longitud (porque no cabría en siete bits), y si es 111 1111
, los siguientes 8 bytes son la longitud (si tampoco caben en dos bytes).
A continuación hay cuatro bytes que son las "máscaras" que necesita para decodificar los datos del cuadro. Esto se hace usando una codificación xor que usa una de las máscaras tal como se define en indexOfByteInData mod 4
de los datos. La decodificación simplemente funciona como encodedByte xor maskByte
(donde maskByte
es indexOfByteInData mod 4
).
Ahora debo decir que no tengo experiencia con C# en absoluto, pero esto es algo de pseudocódigo (algunos acento JavaScript Me temo):
var length_code = bytes[1] & 127, // remove the first 1 by doing '& 127'
masks,
data;
if(length_code === 126) {
masks = bytes.slice(4, 8); // 'slice' returns part of the byte array
data = bytes.slice(8); // and accepts 'start' (inclusively)
} else if(length_code === 127) { // and 'end' (exclusively) as arguments
masks = bytes.slice(10, 14); // Passing no 'end' makes 'end' the length
data = bytes.slice(14); // of the array
} else {
masks = bytes.slice(2, 6);
data = bytes.slice(6);
}
// 'map' replaces each element in the array as per a specified function
// (each element will be replaced with what is returned by the function)
// The passed function accepts the value and index of the element as its
// arguments
var decoded = data.map(function(byte, index) { // index === 0 for the first byte
return byte^masks[ index % 4 ]; // of 'data', not of 'bytes'
// xor mod
});
También puede descargar the specification que puede ser útil (por supuesto, contiene todo lo que necesita para comprender el formato).
Dulce ... Lo probaré en el trabajo el lunes. Le daré la respuesta aceptada si funciona ... :) – gislikonrad
Finalmente me puse a buscar esta solución para mi servidor websocket. Funcionó como un amuleto ... Gracias, hombre ... – gislikonrad
@ Gísli Konráð: Genial funcionó para ti; WebSockets no son realmente amigables para la depuración. – pimvdb