我正在使用WebSocket for python和JavaScriptand,直到现在Google Chrome的握手协议为draft hybi-00。我猜Google Chrome最近将协议更改为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的新手,这些协议让我头疼......
答案 0 :(得分: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)帧。