【问题标题】:websocket handshake on node.jsnode.js 上的 websocket 握手
【发布时间】:2013-08-08 12:42:03
【问题描述】:

我正在尝试构建一个代码来管理与 node.js 的 websocket 连接

我没有找到让握手在 chrome 中被接受的方法

Chrome 返回“与 'ws://127.0.0.1:8888/' 的 WebSocket 连接失败: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");



            });

>>>

希望有人能看到缺少的东西。

【问题讨论】:

    标签: node.js google-chrome websocket handshake


    【解决方案1】:

    代码的问题是您尝试使用 base64 两次。 无需对 secKey 进行 base64。它已经在 base64 中。

    评论以下几行。

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

    在上述注释行之后添加此代码。

    var key64 = secKey;
    

    经过上述修改,错误消失了。

    【讨论】:

    • 我为此使用了 SocketIO 并遇到了类似的问题。这是一种更手动的方式。你推荐这个而不是 SocketIO 吗?
    猜你喜欢
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2019-01-06
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多