【问题标题】:Chrome 16 websocket binaryChrome 16 websocket 二进制
【发布时间】:2012-01-01 22:25:15
【问题描述】:

我正在尝试在 node.js 中设置 websocket 服务器,但遇到了问题。我在 stackoverflow 上找到了一些代码,这是我现在拥有的服务器代码:

var net = require("net"), crypto = require("crypto"), users = [];

net.createServer(function(socket) {
    this.name = "Anonymous";
    users.push(socket);     

    socket.on('data', function(buffer) {
        if(buffer.toString('utf-8').substring(0, 14) === "GET / HTTP/1.1") {
            this.securyPattern = /Sec-WebSocket-Key: (.*)/g;
            this.key = this.securyPattern.exec(buffer);
            this.magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
            this.sha1 = crypto.createHash("sha1");
            this.sha1.update(this.key[1] + this.magic);
            this.accept = this.sha1.digest("base64");
            socket.write("HTTP/1.1 101 Switching Protocols\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + this.accept + "\r\n\r\n");
        } else {
            console.log(buffer);
            console.log(buffer.toString('utf-8'));
        }
    });

    socket.on('end', function() {
        users.splice(users.indexOf(socket), 1);
    });
}).listen(1337);

在连接时一切正常,并且 users.length 会在发生这种情况以及有人断开连接时更新。

问题是我不知道如何读取除了标题(纯文本)之外的消息,所以我必须打印缓冲区和 buffer.toString('utf-8') 的行只打印二进制不同的东西一直以来,例如“你好”这个词:

<Buffer 81 85 71 dc c1 02 19 b9 ad 6e 1e>
??q??☻↓??n▲
<Buffer 81 85 8e 8f 0f a2 e6 ea 63 ce e1>
????☼???c??

我正在使用 Chrome 16 发送这个“你好”: myWebSocket.send("你好");其中 myWebSocket 是 WebSocket 对象。

那么我如何使用这个来读取和写入消息到套接字?

【问题讨论】:

  • 不要自己尝试。使用 socket.io,它有一个很好的 API,可以在服务器和浏览器之间进行实时消息传递,并且在浏览器太笨的情况下还有很多备用方案(flashsockets、长轮询……)。
  • 我一直在寻找如何使用它,但我找不到下载链接,我想我发现它不适用于 Windows,你知道是吗?
  • 它应该可以在 Windows 上运行。你应该用 npm 安装它。

标签: html node.js websocket


【解决方案1】:

这是我处理该缓冲区的代码:

socket.ondata = function(src,start,end) {
    src = src.slice(start,end);
    var maskKeys = [src[2],src[3],src[4],src[5]];
    var dest = new Array();
    for(var i=0;i<src.length-6;i++){
        var mKey = maskKeys[i%4];
        dest[i] = mKey ^ src[6+i];
    }
    console.log(new Buffer(dest).toString());
}

从这里找到:http://songpengfei.iteye.com/blog/1178310

【讨论】:

    【解决方案2】:

    请注意,在握手之后,数据在每帧的开头都带有 2 个或更多的头字节。另请注意,从客户端(浏览器)发送到服务器的有效负载使用简单的 4 字节运行 XOR 掩码进行掩码。

    框架定义为defined in section 5 of the spec

    您可以考虑使用更高级别的抽象,例如 Socket.IO,而不是在 Node 中实现自己的 WebSocket 服务器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多