Chrome 16 websocket二进制

我试图在node.js中build立一个websocket服务器,但有问题。 我在这里find了一些代码在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发送这个“hello”:myWebSocket.send(“hello”); myWebSocket是WebSocket对象。

那么如何读取和写入消息到这个套接字呢?

请注意,在握手之后,数据在每帧的开始处以2个或更多个标题字节构成。 另外请注意,从客户端(浏览器)发送到服务器的有效负载使用一个简单的4字节运行XOR掩码来屏蔽。

规范的第5部分定义了帧定义

而不是在Node中实现自己的WebSocket服务器,你可能会考虑使用像Socket.IO这样的更高层次的抽象。

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

 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()); } 

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