Node.js WebSocket服务器没有收到来自Chrome的正确数据

我一定会错过一些非常明显的东西,但是我无法正确地工作。

握手过程是正确的,但只要我发送一个数据,我就不会在服务器上得到正确的数据。

服务器:

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 。 使用异或解码解码的数据似乎是c2 89 。 一个c2因为某个未知的原因而被预先考虑了 – 这个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发送的内容,以查看问题出在哪里?

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

Chrome 14+使用更新版本的Web Sockets规范,可能无法在您的版本节点WebSocket服务器中实施。

有关更多信息,请参阅旧版本的规范和http://chromestatus.com

此外,当前版本的Chrome甚至是那些实现新规格(Chrome 14和15)的版本都不允许发送二进制数据。

事实certificate,它正在把所有的东西都转换成UTF-8。

根据维基百科 ,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 

令人沮丧的是,但至less现在我知道问题出在哪里了…

我在MacOS X上使用Chrome 14.0.835.186。刚刚在Chrome中由于WebSocket更改而导致应用程序中断。

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

正如作者所说:

警告:这是一个仅实现最新的WebSocket协议草案的库。 它将不会与生产浏览器一起使用,直到发布支持它的新版本。

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