【问题标题】:Python websocket server - sending messagePython websocket服务器 - 发送消息
【发布时间】: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


    【解决方案1】:

    最初的握手是\n\r,而不是\r\n。 无论如何,所有客户端都建立了连接,但是在解析以下消息时,它们会收到一个额外的字节,从而创建导致错误的倾斜帧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2017-09-15
      相关资源
      最近更新 更多