为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

斯蒂芬大帝 2021-03-22 16:23:11
我正在通过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保留(添加了空格以提高可读性)。浏览器为什么不接受这样的消息?没有它遵循中所列准则的规范?我正在尝试支持最新的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 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

您发送的消息的第二个字节(以及代码中的长度检查)看起来不正确。消息的长度以字节单位,而不是位。

摘自RFC6455§5.2(我的重点)

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

“有效载荷数据”的长度(以字节为单位):如果是0-125,则是有效载荷长度。

在浏览器中什么都没收到的原因是您的消息声称具有16字节的正文。浏览器将读取您发送的另外2个字节,然后阻塞等待它期望的另外14个字节,但您不发送。

如果将第二个字节更改为消息中的字节数(0x2或00000010二进制),则说明一切正常。


查看完整回答
反对 回复 2021-03-23
  • 2 回答
  • 0 关注
  • 302 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号