2011-09-20 53 views
0

我为Python和JavaScriptand使用WebSocket,直到现在Google Chrome的握手协议是draft hybi-00。我猜Google Chrome最近改变了协议到draft hybi-10在新的协议握手中的数据编码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

我回答了有关解码hybi-10中的消息的类似问题;也许它有帮助。 http://stackoverflow.com/questions/7040078/not-sure-how-to-frame-data-in-websockets-draft-08/7045885#7045885 – pimvdb

+0

顺便说一句,Chrome 14改为hybi-08(这是几乎hybi-10),而稳定版本刚刚变成了14。Chrome 15将支持二进制帧。 – pimvdb

+0

谢谢,我认为这会有很大帮助! =) – Neuza

回答

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

+0

谢谢!我会研究这一点。这真的很无聊,因为我试图制作一个跨浏览器的应用程序......第一个mozWebSocket现在这个:mozilla。非常感谢您的指示! – Neuza

+0

kanaka 我试着用你的实现来解决这个问题(使用decode_hybi和encode_hybi函数),现在我成功解码从客户端接收到的数据,然后编码数据发送到客户端(使用encode_hybi函数)但不知怎的,数据从来没有收到..我真的不明白什么是错的,我正在使用你的代码(opcode = 1的文本框架)。你能帮我弄清楚吗? – Neuza

+0

@Neuza。这么晚才回复很抱歉。我建议您打开一个新问题并发布代码的相关部分,然后在这里发布一个指向新问题的链接,以便通知我。 – kanaka