我必须遗漏一些非常明显的东西,但我无法正常工作。
握手正常,但是一发送一条数据,我就无法在服务器上获得正确的数据。
服务器:
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 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
)。
答案 0 :(得分:4)
尝试使用Chrome 13(当前稳定频道)。
Chrome 14+使用的newer version Web套接字规范可能未在您的版本节点websocket服务器中实现。
有关详细信息,请参阅规范的old version和http://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。我也只使用纯文本。