我正在尝试在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发送此“hello”: myWebSocket.send( “你好”);其中myWebSocket是WebSocket对象。
那么如何用这个来读取和写入消息呢?
答案 0 :(得分:2)
请注意,在握手之后,数据在每个帧的开头用2个或更多个头字节构成。另请注意,使用简单的4字节运行XOR掩码屏蔽从客户端(浏览器)发送到服务器的有效负载。
框架定义为defined in section 5 of the spec
您可以考虑使用更高级别的抽象,例如Socket.IO,而不是在Node中实现您自己的WebSocket服务器。
答案 1 :(得分: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());
}