【问题标题】:Websocket: Browser dosn't seem to receive data from python serverWebsocket:浏览器似乎没有从 python 服务器接收数据
【发布时间】:2013-05-16 23:45:54
【问题描述】:

我正在通过 python 创建一个 websocket 服务器(我对 python 有点陌生)并且我已经取得了重大进展,但我无法将数据发送到 web 浏览器。我可以建立连接并从浏览器接收数据,但无法发回数据。浏览器只是忽略它。我假设如果浏览器收到一个不符合规范的包,它会终止连接,但连接保持活动状态。

这是我用来将数据编码到帧中的方法:

def encode_message(data):
    frame = "\x81"
    size = len(data)
    if size * 8 <= 125:
        frame += chr(size)
    else:
        raise Exception("Uh, oh. Strings larger than 125 bits are not supported")

    return frame + data

我正在使用sock.sendall(framed_data) 发送数据。可能是什么问题呢?像“yo”这样的消息的数据最终是10000001 00000010 01111001 01101111(添加空格以提高可读性)。为什么浏览器不接受这样的消息?它不遵循the specification 中概述的准则吗?我正在尝试支持我认为是版本 13 的最新 websocket 版本。我使用的是 python 版本 2.7.3。

我曾尝试查看 python websocket 库的源代码,但它们似乎都实现了已被证明存在漏洞的已弃用版本的 websocket 协议。

下面是调用上述函数的代码:

def send(data):
    frame = encode_message(data)
    print "Sending all..."
    sock.sendall(frame) #Socket that handles all communications with client
    print "Frame sent :)"
    return

我还下载了wireshark来嗅探服务器和套接字之间发送的包。我的服务器发送的包与浏览器接受的服务器发送的包相同。我根本看不出有什么不同。 (我直接看的是十六进制源码)

【问题讨论】:

  • 所以没有人知道如何解决这个问题?
  • 浏览器中运行哪些回调? onopen 在握手结束时运行吗? onerroronclose 稍后运行吗?您还记得在完成握手后保持连接打开吗?如果这些问题都不能帮助您找到答案,您能否发布完整的服务器源代码以及一些演示问题的简单客户端代码?
  • onopen 确实在我握手结束时运行。 onclose 直到 websocket 被服务器断开后才会运行。 onerror 永远不会被调用,因为没有抛出错误。握手后,服务端可以接收到客户端的消息,反之则不行。

标签: javascript python websocket


【解决方案1】:

您传输的消息的第二个字节(以及代码中的长度检查)看起来有误。消息的长度以 字节 为单位,而不是位。

来自RFC6455 §5.2(我的重点)

有效载荷长度:7 位、7+16 位或 7+64 位

“Payload data”的长度,bytes:如果是0-125,那就是 有效载荷长度。

浏览器没有收到任何内容的原因是您的消息声称有一个 16 字节的正文。浏览器将读取您发送的另外 2 个字节,然后阻止等待它预期但您未发送的另外 14 个字节。

如果您将第二个字节更改为消息中的字节数 - 0x2 或 00000010 二进制 - 那么一切都会正常。

【讨论】:

  • 我尝试了您的建议,感谢您采纳,但我仍然无法让浏览器接收消息...
  • 愚蠢的问题,但是您发送的是 4 个字节,我接受了吗? (而不是您作为 32 字符字符串发布的消息的二进制版本。)看看调用 encode_message 然后发送帧数据的代码会很有趣。
  • 我添加了调用上述函数的代码。我发送的实际字符串如下所示:�Ok.
  • 我的意思是字符串看起来与它相似。它与上面的示例不同。这正是我目前手头的东西。
  • 抱歉,我看不到您的代码有任何其他问题。我唯一能猜到的是,也许你在握手结束时发送了一些额外的数据,这会妨碍你的下一条消息
【解决方案2】:

我终于找到了问题所在!我花了好几个小时调试和弄乱我的代码。在仔细检查了服务器和客户端之间来回发送的包之后,我终于意识到我的服务器的连接升级响应存在问题。每当它计算一个哈希值时,它还会在它的末尾添加一个\n。这导致在其中一行的末尾出现\n\r\n。客户端将其解释为该传输的结束,随后的所有内容都使用 WebSocket 协议进行解析。我在标题之后还有另一行,所以它完全搞砸了我与客户的沟通。我仍然可以从客户端读取数据,但如果我尝试向客户端写入数据,数据就会变得混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2014-07-20
    相关资源
    最近更新 更多