2013-05-11 88 views
0

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

这里是我使用的数据编码为帧中的方法:

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的嗅探服务器和插座之间发送的包。我的服务器发送的包与从浏览器接受的服务器发送的包相同。我根本看不出有什么不同。 (我直接看着十六进制源)

+0

所以没有人知道如何解决这个问题? – CoderOfHonor 2013-05-12 02:07:48

+0

什么回调在您的浏览器中运行? 'onopen'在握手结束时运行吗? 'onerror'或'onclose'稍后运行?你是否记得在完成握手后保持连接打开?如果这些问题都不能帮助您找到答案,您是否可以发布完整的服务器源代码以及一些可以证明问题的简单客户端代码? – simonc 2013-05-13 08:33:28

+0

'onopen'在我的握手结束时运行。在服务器断开websocket之前'onclose'不运行。 'onerror'永远不会被调用,因为不会抛出任何错误。握手完成后,服务器可以接收来自客户端的消息,但反向不起作用。 – CoderOfHonor 2013-05-13 21:09:46

回答

0

我终于想出了问题!花了几个小时的调试工作,搞乱了我的代码。仔细检查服务器和客户端之间来回发送的包后,我终于意识到我的服务器的连接升级响应出现问题。每当它计算出散列值时,它也会在其末尾添加一个\n。在其中一条线的末端产生\n\r\n。客户端解释说,随着该传输的结束以及随后的所有内容都使用WebSocket协议进行分析。之后我在标题中有另一行,所以它完全搞砸了我与客户的沟通。我仍然可以从客户端读取数据,但是如果我试图写入客户端,数据会变得混乱。

1

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

RFC6455 §5.2(我的强调)

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

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

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

如果将第二个字节更改为消息中的字节数 - 0x2或00000010二进制 - 则事情应该起作用。

+0

我试过你的建议,谢谢你的提醒,但我仍然无法让浏览器收到消息... – CoderOfHonor 2013-05-13 21:47:26

+0

Daft问题,但你发送4个字节我拿它? (而不是发布为32字符字符串的消息的二进制版本)。看到调用'encode_message'的代码然后发送框架化数据会很有趣。 – simonc 2013-05-13 22:05:25

+0

我添加了调用上述函数的代码。我发送的实际字符串如下所示:' Ok'。 – CoderOfHonor 2013-05-13 22:12:28

相关问题