我使用python和javascript的WebSocket,直到现在Google Chrome的握手协议是hybi-00草案。我猜Google Chrome最近把协议改成了hybi-10草案。
所以今天我更新了握手代码,现在WebSocket成功创建并打开了。在JavaScript的onopen事件中,我发送了一个简单的文本消息:
viz.ws = new WebSocket("ws://127.0.0.1:5500");
viz.ws.onopen = function() {
viz.ws.send("TESTn");
};
我的Python服务器接收这个数据。然而,它以某种方式编码,我无法获得我发送的简单文本"TESTn"
:
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
它们总是不同的,但是发送的文本总是TESTn
。
同样,服务器接收到这个数据,但是客户端没有接收到来自服务器的任何数据。
我读到hybi-10使用二进制文件…我是否在该代码中丢失了数据转换?抱歉,我对WebSockets很陌生,这些协议让我很困惑。
数据在HyBi (HyBi-00实际上是hyxie -76)中的框架方式发生了重大变化。新的框架格式如下图所示。
同样,对于从客户端发送到服务器的数据,数据是被屏蔽的。掩码是帧有效载荷的前4个字节,并使用以下简单算法进行解码(实际上是编码):
data[i] = data[i] XOR mask[j MOD 4]
每一帧的掩码密钥是不同的,这就是为什么你每次都得到不同的有效载荷,即使你发送相同的数据。
如果客户端没有接收到你发送的数据,很可能是你没有正确地帧数据。另外请注意,Chrome 14和Firefox 6/7还不支持二进制数据,所以操作码需要为1来表示文本(UTF-8)帧。