1

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

握手是正确的,但是一旦我发送了一条数据,我就没有在服务器上得到正确的数据。

服务器:

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. Ac2因某种未知原因而被前置 -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 发送的内容,从而了解问题所在?
4

3 回答 3

4

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

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

有关详细信息,请参阅旧版规范和http://chromestatus.com

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

于 2011-08-22T22:52:52.453 回答
1

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

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

正如作者所说:

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

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

于 2011-09-25T16:05:42.577 回答
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

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

于 2011-08-23T10:41:58.953 回答