【发布时间】: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在握手结束时运行吗?onerror或onclose稍后运行吗?您还记得在完成握手后保持连接打开吗?如果这些问题都不能帮助您找到答案,您能否发布完整的服务器源代码以及一些演示问题的简单客户端代码? -
onopen确实在我握手结束时运行。onclose直到 websocket 被服务器断开后才会运行。onerror永远不会被调用,因为没有抛出错误。握手后,服务端可以接收到客户端的消息,反之则不行。
标签: javascript python websocket