在websocket中解码连续帧

你如何解码websocket中的连续帧? 有人可以给我一个有用的见解呢? 将连续帧解码为文本帧会导致错误。

我发送一个大的文本string到服务器,我可以设法解码只有第一个传入的文本框架,然后失败。

这里是nodejs中一个简单的函数来处理文本帧解码 –

function decodeWS(data) { var dl = data[1] & 127; var ifm = 2; if (dl == 126) { ifm = 4; } else if (dl == 127) { ifm = 10; } var i = ifm + 4; var masks = data.slice(ifm,i); var index = 0; var output = ""; var l=data.length; while (i < l) { output += String.fromCharCode(data[i++] ^ masks[index++ % 4]); } return output; } 

获取特定的帧位

鳍位

 bool fin = (data[0] & 128) == 128; 

操作码

 int opCode = data[0] & 15; 

IsMasked

 bool isMasked = (data[1] & 128) == 128; 

数据长度

 int dataLength = data[1] & 127; 

Websocket框架概述

 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-------+-+-------------+-------------------------------+ |F|R|R|R| opcode|M| Payload len | Extended payload length | |I|S|S|S| (4) |A| (7) | (16/64) | |N|V|V|V| |S| | (if payload len==126/127) | | |1|2|3| |K| | | +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + | Extended payload length continued, if payload len == 127 | + - - - - - - - - - - - - - - - +-------------------------------+ | |Masking-key, if MASK set to 1 | +-------------------------------+-------------------------------+ | Masking-key (continued) | Payload Data | +-------------------------------- - - - - - - - - - - - - - - - + : Payload Data continued ... : + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | Payload Data continued ... | +---------------------------------------------------------------+ 

有关如何获取一个字节的特定位的一般信息

示例:获取FIN位

首先记下第一个字节的二进制表示,让我们假装第一个位是130 ,那么在Binary中1000 0010或者更易于理解的Fin位设置,opCode 2为Binary Data。 如果你想得到最重要的位,你需要使用逻辑AND(&)运算符128 (二进制1000 0000 )。

所以基本上1和1将是1,其他的都是0。

 1000 0010 -> First Byte 1000 0000 -> Our Masking Byte => 128 in Decimal --------- 1000 0000 -> Resulting Byte => 128 in Decimal (Fin bit set) 

Fin另一个例子没有设置和文本数据。

 0000 0001 -> First Byte 1000 0000 -> Our Masking Byte -> 128 in Decimal --------- 0000 0000 -> Resulting Byte => 0 in Decimal (Fin bit not set) 

示例:获取操作码(OpCode告诉你这个帧用于什么)

操作码可以从第一个字节的前4位收集。 假设FIN位已设置,并且OpCode是文本。

 1000 0001 -> First Byte 0000 1111 -> Our Masking Byte => 15 in Decimal --------- 0000 0001 -> Resulting Byte => 1 in Decimal (Text OpCode)