【发布时间】:2020-10-30 23:25:40
【问题描述】:
我正在编写自己的 websocket 服务器和客户端。我已成功处理握手并建立连接。
现在我正在编写用于创建适当帧的 send_message 函数。下面的例子只是为了这个问题的目的,它不是我最终打算写的,这只是我尝试给我相同的以下结果的众多方式中的一种。
def send_message(client_socket: socket.socket, message: str):
length = len(message)
opcode = 0x1
fin, rsv1, rsv2, rsv3, opcode = 1, 0, 0, 0, opcode
first_byte = chr(fin << 7 | rsv1 << 6 | rsv2 << 5 | rsv3 << 4 | opcode)
if length < 126:
mask = 0
second_byte = chr(mask << 7 | length)
first_byte += second_byte
first_byte = six.b(first_byte)
payload = first_byte + message.encode("utf-8")
return client_socket.send(payload)
对于输入:Ok from server 以上函数应发送b'\x81\x0eOk from server'
第一个字节
\x81 - 10000001
第一位设置为 1 - FIN,表示这是消息的最后一帧
第二个、第三个和第四个 - 全为零,对于这个例子无关
以下四位 - opcode0001,表示消息是文本
有问题的第二个字节
\x0e 应该是 00001110
第一位设置为 0 - mask,如果设置为 1,则有效负载被屏蔽,在我的情况下必须设置为 0,从服务器到客户端的所有消息都不得被屏蔽
以下 7 位 - 有效载荷长度,在 Ok from server = 14 的情况下
剩下的是有效载荷。
现在,当我将其发送到 chrome 中的 javascript 客户端时,我收到:
WebSocket connection to 'ws://localhost:8002/' failed: A server must not mask any frames that it sends to the client.
我从多个示例(websockets、SimpleWebsocketServer 等)中复制了代码,所有示例都给了我相同的 b'\x81\x0eOk from server'
问题 #1 我做错了什么?
问题 #2 如何调试 websocket?在 chrome devtools 中,不再有用于检查 websocket 的“框架”选项卡,因此看不到接收到的实际字节。尝试过 Wireshark,但多年来一直缺少解码 websocket 框架的功能。
编辑
该函数创建了正确的有效负载,问题出在其他地方,可能是套接字设置。
【问题讨论】:
标签: python python-3.x websocket