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

Data encoding in new protocol handshake hybi-10

本文关键字:hybi-10 协议 编码 新协议 数据      更新时间:2023-09-26

我使用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("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 (HyBi-00实际上是hyxie -76)中的框架方式发生了重大变化。新的框架格式如下图所示。

同样,对于从客户端发送到服务器的数据,数据是被屏蔽的。掩码是帧有效载荷的前4个字节,并使用以下简单算法进行解码(实际上是编码):

data[i] = data[i] XOR mask[j MOD 4]

每一帧的掩码密钥是不同的,这就是为什么你每次都得到不同的有效载荷,即使你发送相同的数据。

如果客户端没有接收到你发送的数据,很可能是你没有正确地帧数据。另外请注意,Chrome 14和Firefox 6/7还不支持二进制数据,所以操作码需要为1来表示文本(UTF-8)帧。