Node.js WebSocket服务器无法从Chrome收到正确的数据

时间:2011-08-22 22:43:55

标签: google-chrome encoding node.js websocket chromium

我必须遗漏一些非常明显的东西,但我无法正常工作。

握手正常,但是一发送一条数据,我就无法在服务器上获得正确的数据。

服务器:

stream.on("data", function(data) {
    if(!handshake) return doHandshake(); // no problems with handshake
    console.log(data);
});

客户端:

ws = new WebSocket("ws://localhost:12345");
ws.onopen = function() {
    ws.send(String.fromCharCode(parseInt("89", 16)));
}

我在node.js控制台中看到的内容:

<Buffer 81 82 ed 68 ae 67 2f e1>

因此密钥为ed 68 ae 67,编码数据为2f e1。使用xor解码解码数据似乎是c2 89c2由于某种未知原因而被置于前面 - 89是正确的。

其他角色也会发生奇怪的事情:

ws.send(String.fromCharCode(parseInt("ab", 16)));

我明白了:

<Buffer 81 82 ff 8e 45 34 3d 25>

解码数据为c2 ab而不是ab

我正在使用新的框架格式(Chrome 15)和Windows版本的节点(node.exe)。

  • 这里出了什么问题?
  • 是否可以查看Chrome发送的内容,以便了解问题所在?

3 个答案:

答案 0 :(得分:4)

尝试使用Chrome 13(当前稳定频道)。

Chrome 14+使用的newer version Web套接字规范可能未在您的版本节点websocket服务器中实现。

有关详细信息,请参阅规范的old versionhttp://chromestatus.com

此外,当前版本的Chrome,即使是实施新规范的版本(目前为Chrome 14和15)也不允许发送二进制数据。

答案 1 :(得分:1)

事实证明它正在将所有内容转换为UTF-8。

根据Wikipedia,127和2047之间的所有内容(基数为10)将被编码为两个字节:

110bbbaa  10aaaaaa

例如89

base 16 - 89
base 10 - 137
base 2  - 10001001    so bbb = 000, aaaaaaaa = 10001001

它在基数10中超过127.因此将编码为:

110bbbaa  10aaaaaa
11000010  10001001

位于16号基地:

c2 89

令人沮丧的是,但至少我现在知道问题所在......

答案 2 :(得分:1)

我在MacOS X上使用Chrome 14.0.835.186。由于Chrome中的WebSockets更改,我的应用程序出现问题。

我切换到: https://github.com/Worlize/WebSocket-Node

正如作者所说:

  

警告:这是一个仅实现最新WebSocket协议草案的库。在发布支持它的新版本之前,它不适用于生产浏览器。

这是一个内部应用程序,所以我可以强迫人们使用Chrome 14,但有一个黑客支持其他草稿https://gist.github.com/1219165。我也只使用纯文本。