新协议握手hybi-10中的数据编码

时间:2011-09-20 13:44:40

标签: javascript python google-chrome websocket

我正在使用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的新手,这些协议让我头疼......

1 个答案:

答案 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)帧。