WebSocket首字节Opcode始终返回0x8,该行为是否正常?
WebSocket Opcode 总是返回8的问题解析
你提取Opcode的方式错误,这才导致每次得到的结果都是8。
根据WebSocket协议规范,帧首字节的结构为:
- 第1位:FIN(标识该帧是否为完整帧)
- 第2-4位:RSV1、RSV2、RSV3(保留位,通常取值为0)
- 第5-8位:Opcode(共4位,用于标识帧类型)
你用右移4位的方式提取Opcode,会错误地将最高位的FIN位包含进来。比如首字节0x81(二进制10000001),右移4位后得到1000(十进制8),但这个值里的最高位是FIN位的1,并非Opcode的一部分。
正确提取Opcode的方式是按位与0x0F,这样只会保留首字节的最后4位:0x81 & 0x0F = 0x01(十进制1),这正是你期望的文本帧Opcode。
你提到关闭连接时的首字节0x88(二进制10001000),按位与0x0F后得到0x08(十进制8),这确实是关闭帧的Opcode,属于正常行为。
另外你期望的首字节0x17(二进制00010111)是错误的:FIN位为0表示这是分片帧的一部分,Opcode为7属于协议保留值,并非正常的文本帧格式。
修正后的Python代码:
data = bytearray(b'\x81\x8c\xf9t&\x90\x91\x1bJ\xf1\xd9\x07C\xe2\x8f\x11T\xb1') opcode = data[0] & 0x0F print(opcode) # 输出1 assert 1 == opcode
内容的提问来源于stack exchange,提问作者7436284734
相关产品推荐
相关产品推荐

