Websocket:浏览器似乎没有从python服务器接收数据

时间:2013-05-11 03:11:09

标签: javascript python websocket

我正在通过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中列出的准则?我试图支持最新的websocket版本,我相信它是版本13.我使用的是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来嗅探服务器和套接字之间发送的包。我的服务器发送的包与从浏览器接受的服务器发送的包相同。我根本看不出任何差别。 (我直接看了六角源)

2 个答案:

答案 0 :(得分:1)

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

来自RFC6455 §5.2(我的重点)

  

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

     

“有效载荷数据”的长度,以字节:如果为0-125,那就是   有效载荷长度。

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

如果你将第二个字节更改为消息中的字节数 - 0x2或00000010二进制 - 那么事情应该可行。

答案 1 :(得分:0)

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