如何解码websocket中的延续帧?有人能给我一些有用的见解吗?将延续帧解码为文本帧会导致错误。
我正在向服务器发送一个大的文本字符串,我只能设法解码第一个传入的文本帧,之后失败。
下面是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;
<标题>操作码h1> IsMasked h1> DataLength h1> h1>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
,那么1000 0010
是二进制或更容易理解的Fin位集,opCode 2是二进制数据。如果你想获得最高有效位,你需要对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 bit未设置和Text Data.
0000 0001 -> First Byte
1000 0000 -> Our Masking Byte -> 128 in Decimal
---------
0000 0000 -> Resulting Byte => 0 in Decimal (Fin bit not set)
示例:获取OpCode (OpCode告诉你这个帧是用来做什么的)
OpCode可以从第一个字节的前4位收集。假设FIN位已设置,OpCode为Text。
1000 0001 -> First Byte
0000 1111 -> Our Masking Byte => 15 in Decimal
---------
0000 0001 -> Resulting Byte => 1 in Decimal (Text OpCode)
标题>标题>