Рукопожатие веб-сокета на node.js

Я пытаюсь создать код, управляющий соединением через веб-сокет с помощью node.js.

Я не нахожу способ принять рукопожатие в хроме

Chrome возвращает «Соединение WebSocket с« ws://127.0.0.1: 8888 / »не удалось: ошибка во время рукопожатия WebSocket: несоответствие Sec-WebSocket-Accept "

с этим

<<>>>

var http=require("http");
var crypto=require("crypto");

var server=http.createServer(function(req,res){

res.writeHeads("200","content-type:text/plain");
res.end();  


    });

    server.on("upgrade",function(req,socket,head){

        for(var item in req.headers){
console.log(item);  
console.log(req.headers[item]); 
        }


var GUID="258EAFA5-E914-47DA-95CA-C5AB0DC85B11";    

var secKey=req.headers["sec-websocket-key"];


var sha=crypto.createHash("sha1");
secKey+=GUID;
secKey=sha.update(secKey).digest("base64");

var key64=new Buffer(secKey);
key64=key64.toString("base64");



console.log(key64);

var headersReturn='HTTP/1.1 101 Switching Protocols\r\n';
headersReturn+='Upgrade: websocket\r\n';
headersReturn+='Connection: Upgrade\r\n';
headersReturn+='Sec-WebSocket-Accept:'+key64+"\r\n\r\n";

var boo=socket.write(headersReturn);

console.log(headersReturn); 

socket.on("connect",function(){console.log("success");});
socket.on("data",function(data){
console.log(data);  
    });     

        });

        server.listen(8888,"127.0.0.1",function(){

console.log("server is on 8888");



            });

<<<>>>>

Надеюсь, кто-нибудь увидит, чего не хватает.


person juanou    schedule 07.08.2013    source источник


Ответы (1)


Проблема с кодом в том, что вы дважды пытаетесь использовать base64. Не нужно использовать base64 для secKey. Он уже в base64.

Прокомментируйте следующие строки.

var key64=new Buffer(secKey);
key64=key64.toString("base64");

Добавьте этот код после строк с комментариями выше.

var key64 = secKey;

После вышеуказанной модификации ошибки исчезли.

person Chandu    schedule 07.08.2013
comment
Я использую для этого SocketIO и сталкиваюсь с подобными проблемами. Это более ручной способ сделать это. Вы рекомендуете это вместо SocketIO? - person kiwicomb123; 18.05.2018