从 Python 中的 WebSocket 读取(来自 Javascript WebSocket 的数据)
Posted
技术标签:
【中文标题】从 Python 中的 WebSocket 读取(来自 Javascript WebSocket 的数据)【英文标题】:Reading From a WebSocket in Python (Data from Javascript WebSocket) 【发布时间】:2015-05-21 04:50:38 【问题描述】:我在解码通过 websockets 从 Chrome (javascript) 发送到 python 服务器的数据时遇到了一些问题(使用低级套接字 API)。我已经正确处理了握手,当我使用.send(...)
时,websocket 的readyState
是打开的。我收到字节数据(根据规范),但无论我如何尝试解码它,它都会出现乱码或触发异常。
javascript
var we = new WebSocket(url);
we.send("string data");
蟒蛇
data = socket.recv(1024) # socket from sock.accept(...)
#handle data
我已经尝试过data.decode('utf-8')
,因为这似乎是显而易见的解决方案(引发错误)。我试过剥离 \x80
和 \x81
(我想 - 我在 *** 的某个地方读过它),但它仍然会引发错误......
我已经尝试过 base64 解码 - 我在 SO 上的答案中找到了它(但这没有意义,所以......)
我缺少什么吗?
【问题讨论】:
您能否发布握手后收到的数据样本?它可能被压缩了。 @Blender 它在 UTF8 中是垃圾,但我做了一个十六进制转储,结果为 81:85:86:56:99:b4:ee:33:f5:d8:e9 用于发送的字符串“你好” @Blender 就我而言,它没有使用压缩,因为我在握手响应中拒绝了该扩展。 【参考方案1】:我不精通WebSocket通信,但是根据这个answer,对数据进行了编码(见接收消息部分)
>>> pkt = [int(x, 16) for x in '81:85:86:56:99:b4:ee:33:f5:d8:e9'.split(':')]
>>> pkt[0] # header should be 129 for text mode
129
>>> len = pkt[1] & 0b01111111
>>> len
5
>>> mask = pkt[2:6]
>>> data = pkt[6:]
>>> for i,c in enumerate(data):
... print chr(c ^ mask[i % 4])
...
h
e
l
l
o
请注意,这只是解码特定示例数据的示例,并未考虑完整规范。例如,数据长度可以是多个字节(因此掩码和数据块的位置可能会有所不同)。
【讨论】:
谢谢。我不需要完整的规格,只需要小众功能。我会试一试(今晚......也许 - 明天我会回来并接受如果它有效) 太棒了。有效。也谢谢你的帖子,非常有帮助。以上是关于从 Python 中的 WebSocket 读取(来自 Javascript WebSocket 的数据)的主要内容,如果未能解决你的问题,请参考以下文章
从 C# 中的 WebSocket 流中读取整个字符串 [重复]
如何从javascript客户端onmessage函数发送/读取java ByteBuffer(websocket)