我正在尝试使用websockets来满足网页与node.js的通信。 我现在已经尝试了几个小时,但根本不知道出了什么问题。
服务器
var net = require('net');
var server = net.createServer(function (socket) {
var handsShaked=false;
socket.on('data', function(data) {
if(!handsShaked){
data=(data+"").split("\r").join("").split("\n");
var key=null;
for(i in data){
if(data[i].indexOf("Sec-WebSocket-Key:")===0)
key=data[i].split(":")[1].split(" ").join("");
}
var magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
var sha = sha1(key+magic);
var accept = new Buffer(sha).toString('base64');
socket.write(
"HTTP/1.1 101 Switching Protocols\r\n"+
"Upgrade: websocket\r\n"+
"Connection: Upgrade\r\n"+
"Sec-WebSocket-Accept: "+accept+"\r\n"
);
handsShaked=true;
}
socket.write("test");
});
});
server.listen(10666);
客户
socket = new WebSocket("ws://localhost:10666");
socket.onopen=function(){
console.log('open');
socket.send('Dit is een test');
}
socket.onmessage=function(msg){
console.log('msg');
alert(msg);
}
socket.onerror = function (error) {
console.log('error');
alert('WebSocket Error ' + error);
};
有谁知道它为什么不起作用?
您在握手响应结束时错过了最后的\\r\\n
请参阅HTTP rfc2616
Response = Status-Line ; Section 6.1
*(( general-header ; Section 4.5
| response-header ; Section 6.2
| entity-header ) CRLF) ; Section 7.1
CRLF
[ message-body ] ; Section 7.2
您的代码在响应后缺少CRLF
。
一旦你得到握手工作,行socket.write("test");
不会像你期望的那样工作。 框架消息是框架式的,因此您需要额外的代码来读取和写入消息。