新协议握手 hybi-10 中的数据编码
Posted
技术标签:
【中文标题】新协议握手 hybi-10 中的数据编码【英文标题】:Data encoding in new protocol handshake hybi-10 【发布时间】:2011-09-20 13:44:39 【问题描述】:我正在为 python 和 javascript 使用 WebSocket,到目前为止,Google Chrome 的握手协议是draft hybi-00。我猜谷歌浏览器最近将协议更改为draft hybi-10。
所以今天我更新了握手代码,现在 WebSocket 已成功创建并打开。在 JavaScript 中的 onopen 事件中,我发送一条简单的文本消息:
viz.ws = new WebSocket("ws://127.0.0.1:5500");
viz.ws.onopen = function()
viz.ws.send("TEST\n");
;
我的 Python 服务器接收到这些数据。但是,它以某种方式编码,我无法获得我发送的简单文本"TEST\n"
:
def recv_data(self, client, count):
try:
data = client.recv(count)
except:
return False
print data
print data.decode('utf-8','ignore')
return data.decode('utf-8', 'ignore')
打印返回:
üàÍu┬¯é0æ║▄
u0
它们总是不同的,但发送的文本总是TEST\n
。
同样,服务器接收到这些数据,但客户端没有接收到服务器发送的任何数据。
我读到 hybi-10 使用二进制文件...我是否错过了该代码中的数据转换?抱歉,我对 WebSockets 很陌生,这些协议让我很头疼……
【问题讨论】:
我回答了一个关于在 hybi-10 中解码消息的类似问题;也许它有帮助。 ***.com/questions/7040078/… 对了,Chrome 14 改成了 hybi-08(差不多是 hybi-10),稳定版最近才改成 14。Chrome 15 将支持二进制帧。 谢谢,我认为这会很有帮助! =) 我刚刚有一个包含很多 websocket 的项目,并使用了 Twisted 和 txwebsocket。 hybi-10 和 Hixie-76 都适用于各自的 Chrome 版本。如果你想要一个替代品,你可以试试。 我会看看那个。谢谢;) 【参考方案1】:HyBi(HyBi-00 实际上是 Hixie-76)中的数据框架方式发生了显着变化。 this diagram 中描述了新的帧格式。
另外,对于从客户端发送到服务器的数据,数据是masked。掩码是帧有效负载的前 4 个字节,并使用以下简单算法在适当位置进行解码(并实际编码):
data[i] = data[i] XOR mask[j MOD 4]
每个帧的掩码键都不同,这就是为什么即使您发送相同的数据,每次都会得到不同的有效负载。
如果客户端没有收到您发送的数据,则可能是您没有正确构建数据。另请注意,Chrome 14 和 Firefox 6/7 尚不支持二进制数据,因此操作码需要为 1 才能表示文本 (UTF-8) 帧。
【讨论】:
谢谢!我会调查的。这真的很无聊,因为我正在尝试制作一个跨浏览器的应用程序......第一个 mozilla 和 mozWebSocket 现在这个:P。非常感谢您的指点! kanaka,我尝试使用你的实现来解决这个问题(使用 decode_hybi 和 encode_hybi 函数),现在我成功解码了从客户端接收到的数据,然后我对数据进行编码以发送到客户端(使用 encode_hybi 函数)但不知何故从未收到数据。我真的看不出有什么问题,我正在使用您的代码(对于文本框架,opcode=1)。你能帮我解决这个问题吗? @Neuza。这么晚才回复很抱歉。我建议打开一个新问题并发布代码的相关部分,然后在此处发回新问题的链接,以便我收到通知。 嘿,没问题。我想到了。我无法发送帧,但问题出在握手中。不知道我是如何设法接收帧并建立连接的,但现在握手更正后一切正常。无论如何感谢您的回复:)以上是关于新协议握手 hybi-10 中的数据编码的主要内容,如果未能解决你的问题,请参考以下文章