在Hybi-10 WebSocket服务器中发送数据的问题

4 投票
1 回答
2346 浏览
提问于 2025-04-17 03:13

我正在尝试在一个Python服务器中实现新的hybi-10协议,目前我已经成功完成了握手和从客户端(JavaScript)接收数据,但现在在发送数据给客户端时遇到了问题。

我使用了一些来自websockify的代码(encode_hybi函数)来根据这个协议对数据进行编码。不过不幸的是,客户端似乎没有收到数据,因为消息事件从来没有被触发。

我现在的代码是这样的:

def encode_hybi(self, buf, opcode = 0x01):

    buf = b64encode(buf)

    b1 = 0x80 | (opcode & 0x0f) 
    payload_len = len(buf)
    if payload_len <= 125:
        header = struct.pack('>BB', b1, payload_len)
    elif payload_len > 125 and payload_len < 65536:
        header = struct.pack('>BBH', b1, 126, payload_len)
    elif payload_len >= 65536:
        header = struct.pack('>BBQ', b1, 127, payload_len)

    print repr(header + buf)

    return header + buf

def send(self, data):
    logging.info("Message Sent: %s" % data)

    if (self.protocol == 'hixie-76'):
        self.client.send("\x00%s\xff" % data)
    elif (self.protocol =='hybi-10'):
        msg = self.encode_hybi(data)
        self.client.send(msg)

我通过socket发送了一个简单的'OK'。在调用encode_hybi函数后,我得到了:'\x81\x04T0s=',这个数据被发送到JavaScript。但我没有收到任何响应,也没有错误信息。

我尝试发送其他数据,比如'OKKK'。在调用encode_hybi函数后,我得到了:'\x81\x08T0tLSw=='。不知道这是否有帮助,但发送这个数据后,JavaScript出现了一个错误:

未识别的帧操作码:13。

每当发送的数据长度超过3个字符时,这个错误就会出现。

我真的搞不懂问题出在哪里。编码是不是有什么问题?

1 个回答

4

你在握手格式的结尾用了 \n\r\n\r\n,但其实应该是 \r\n\r\n。现在的 \n 被算作了密钥的一部分。

虽然我不太明白你是怎么还能打开连接的,但看起来去掉第一个 \n 就能解决这个问题。

撰写回答