在 hybi-10 WebSockets 服务器中发送数据时出现问题

Posted

技术标签:

【中文标题】在 hybi-10 WebSockets 服务器中发送数据时出现问题【英文标题】:Problem sending data in hybi-10 WebSockets server 【发布时间】:2011-09-27 20:37:20 【问题描述】:

我正在尝试在 python 服务器中实现新的 hybi-10 协议,现在我成功地握手并从客户端 (javascript) 接收数据,但现在我在将数据发送到客户端时遇到问题.

我正在使用websockify(encode_hybi 函数)中的一些代码根据此协议对帧进行编码。但不幸的是,客户端似乎没有收到数据,因为 on message 事件永远不会触发。

所以我的代码是这样的:

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)

我正在通过套接字发送一个简单的'OK'。所以在 encode_hybi 函数之后我得到: '\x81\x04T0s=' 发送到 JavaScript。我没有回应,也没有错误。

我尝试发送其他数据,例如'OKKK'。在 encode_hybi 函数之后,我得到:'\x81\x08T0tLSw=='。不知道它是否有帮助,但发送此数据后,JavaScript 会出现错误:

无法识别的帧操作码:13。

每次发送的数据长度大于3个字符时都会出现此错误。

我真的无法理解这个问题。编码有问题吗?

【问题讨论】:

什么是客户端?根据错误,它看起来像是 Chrome。如果是这样,请查看 chrome://net-internals/。选中右侧的复选框以捕获字节,然后转到 chrome://net-internals/#events&q=type:SOCKET%20is:active 并查找您的套接字以查看实际接收到的字节。有什么有趣的地方吗? 是的,我正在使用 chrome。我这样做了,对于发送的“OK”字符串,我得到了 6 个字节数 (see here)。但是,如果我发送一个更大的字符串,例如“OKKKK”,则套接字不会出现在 is:active 标记下.. 我看到握手响应以\n\r\n\r\n 结尾。您能否尝试删除第一个 \n,因为它应该以 \r\n\r\n 结尾。 天哪,就是这样!我将解释:在握手中,我使用的是 Python 内置的 encode('base64') ,它每次都在末尾附加一个 \n 。我从 base64 包更改为 b64encode 函数,现在工作正常。非常感谢,我为此发疯了,这一直是 \n :P. 我在 java 中遇到了同样的问题,让我大吃一惊,为什么我可以在握手后收到消息但永远无法发送任何东西。操作码 13,魔鬼。删除最后一个 \r\n 工作,因为无论如何我都在完成每一行,包括 sec-websocket-accept 行。几乎看起来像是协议中的一个错误。 【参考方案1】:

你在握手格式的末尾使用了\n\r\n\r\n,但它应该是\r\n\r\n。目前\n 是密钥的一部分。

虽然我不明白您是如何打开连接的,但删除第一个 \n 似乎可以解决问题。

【讨论】:

以上是关于在 hybi-10 WebSockets 服务器中发送数据时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

新协议握手 hybi-10 中的数据编码

如何在 xmpp openfire 服务器中启用 websockets

如何使用 WebSockets

Websockets 和可扩展性

如何在 asp.net core 中使用 websockets

Go 实现 WebSockets:1.什么是 WebSockets