我正在通过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来嗅探服务器和套接字之间发送的包。我的服务器发送的包与从浏览器接受的服务器发送的包相同。我根本看不出任何差别。 (我直接看了六角源)
答案 0 :(得分:1)
传输的消息的第二个字节(以及代码中的长度检查)看起来是错误的。消息的长度是字节,而不是位。
来自RFC6455 §5.2(我的重点)
有效载荷长度:7位,7 + 16位或7 + 64位
“有效载荷数据”的长度,以字节:如果为0-125,那就是 有效载荷长度。
浏览器中未收到任何内容的原因是您的邮件声称有一个16字节的正文。浏览器将读取您发送的另外2个字节,然后阻止等待它预期的另外14个字节但您不发送。
如果你将第二个字节更改为消息中的字节数 - 0x2或00000010二进制 - 那么事情应该可行。
答案 1 :(得分:0)
我终于弄明白了这个问题!花了几个小时调试并弄乱了我的代码。在仔细检查在服务器和客户端之间来回发送的包之后,我终于意识到我的服务器的连接升级响应存在问题。每当计算哈希值时,它还会在其末尾添加\n
。这导致其中一条线的末尾有一个\n\r\n
。客户端解释说,作为传输的结束,随后的所有内容都使用WebSocket协议进行了解析。之后我在标题中有另一行,所以它完全弄乱了我与客户端的通信。我仍然可以从客户端读取,但如果我尝试写入客户端,数据就会搞砸。