【问题标题】:Node.js WebSocket server does not receive correct data from ChromeNode.js WebSocket 服务器未从 Chrome 接收正确的数据
【发布时间】:2011-08-22 22:43:54
【问题描述】:

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

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

服务器:

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 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 发送的内容,从而找出问题所在?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不,hixie-76 不工作(握手已经失败)。我已经在使用新的 hybi-10 握手,所以实际上我必须使用 Chrome 15。
    • 现在我查看chromestatus.com,我看到它声明m15: Binary message API (planned)。这是否意味着我现在只能发送“普通”字符而不是任意字符?
    • 你实现了自己的服务器吗?看起来您正在使用基于 stream.on() 调用的 socket.io。是的,现在你只能发送文本数据,不能发送二进制数据。
    • 是的,我正在尝试构建自己的,这就是我遇到的麻烦。但是无法发送二进制数据的事实似乎回答了我的问题。谢谢!
    • 更新:最新的 Chromium 版本(webkit 修订版 94482)支持发送带有任意二进制值的 ArrayBuffer。事情瞬息万变!
    【解决方案2】:

    原来它正在将所有内容都转换为 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
    

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

    【讨论】:

      【解决方案3】:

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

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

      正如作者所说:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-22
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        • 2011-08-13
        • 2020-09-17
        • 2012-08-24
        相关资源
        最近更新 更多