【发布时间】:2018-05-24 12:43:51
【问题描述】:
我目前正在尝试用 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 个字节)的掩码密钥,其中的所有内容都是有效负载。我必须使用掩码密钥对有效负载运行异或来解密。对吧?
另外,我目前只是读取帧的前两个字节,检查所有内容,甚至可能得到大小。如果我得到了我应该能够读取整个数据包的大小,对吧?
编辑:谢谢你们,我找到了“问题”。我还没有直接在位级别上工作,所以我真的不知道位编号从右到左工作(至少如果它是 LSB),这会引起一些刺激。由于第一个字节看起来完全对称,因此在 biginning 和最后设置了一些位,因此最终检查和对 optcode 的检查有效。因此,如果有人遇到类似问题,请尝试检查您是否真的阅读了正确的内容,您可能需要检查this page;
最好的问候, 专业
【问题讨论】:
-
第 8 位将是第二个字节的第 0 位,而不是第 1 位,并且第 0 位是最右边的位,假设
00100001是字节值33的常用位表示。跨度>