我目前正在尝试用Java创建一个WebSocket服务器,但我遇到了一些问题。目前我正在进行握手(至少我没有任何错误)。然后我从框架开始,我完成了以下事情: - 检查lastFrame位(位0)是否置位。 - 检查是否设置了保留位(位1-3)。如果是,请断开连接。 - 检查opt位(位4-7)是否具有有效值。如果不是,请断开连接。
下一步是掩码位,它应位于第8位(应该是帧的第二个字节中的位1) RFC 6455规范(see here)告诉我,如果从客户端发送这个位应该设置为“1”,我使用Firefox进行连接,所以这肯定是一个客户端,但它没有设置为1.这是我得到的比特输入:
Byte 1: 10000001
Byte 2: 00100001
Byte 3: 11101101
Byte 4: 01000101
Byte 5: 01010001
Byte 6: 00110101
Byte 7: 11100111
Byte 8: 11010011
Byte 9: 00100111
正如您在字节2中看到的,位0有一个0表示该帧未被屏蔽。有人能告诉我,如果我正在寻找面具指示的正确位置,如果是这样,有人知道为什么面具没有设置? 无论如何,我猜数据包本身是有效的,因为第一位始终是10000001,这表示健康的最终帧文本包。
另外,只是为了确认,接下来的步骤是寻找1-7位,这个小于126,这是我的帧长度(以字节为单位)。如果是126,则那7位加上接下来的16位表示长度,如果是127则7位加下64位表示长度。接下来是32位(4字节)的掩码密钥,其中的所有内容都是有效负载。我必须使用masking-key对有效负载运行xor来解密。对吗?
另外,我目前只是读取帧的前两个字节,检查所有内容,甚至可以获得大小。如果我得到了大小,我应该能够读取整个数据包,对吗?
编辑:谢谢大家,我发现了“问题”。我还没有直接在位级工作,所以我真的不知道位编号从右到左(至少如果它是LSB)工作引起了一些刺激。由于第一个字节看起来完全对称,因此在biginning和最后都有一点设置,因此最终检查和optcode的检查工作。因此,如果有人遇到类似问题,请尝试检查您是否真正阅读了正确的位,然后您可能需要检查this page;
祝你好运, 主要
答案 0 :(得分:0)
如所示in the WebSocket Protocol RFC,屏蔽指示位是第2个字节的第8位。
即。 (在C中,因为我不确定用Java编写这个):
// assuming `msg` is `unsigned char` (byte string)
if ((msg[2] & 128)) // ... masked