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 。 我也只使用纯文本。