Javascript Websocket握手不起作用

Javascript Websocket握手不起作用,javascript,c++,websocket,Javascript,C++,Websocket,我有一个使用WinSock2的cpp服务器,我试图用我的javascript客户端连接到此服务器,但它不工作,chrome控制台显示“WebSocket握手时出错:错误的'Sec WebSocket Accept'头值”。 我将我的sha1和base64函数与联机sha1和base64进行了比较,因此问题不在这里 Chrome响应标题: HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-Webs

我有一个使用WinSock2的cpp服务器,我试图用我的javascript客户端连接到此服务器,但它不工作,chrome控制台显示“WebSocket握手时出错:错误的'Sec WebSocket Accept'头值”。 我将我的sha1和base64函数与联机sha1和base64进行了比较,因此问题不在这里

Chrome响应标题:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-Websocket-Accept: NzdkYjg1Y2I4MDRlNTk0OGNmNzI1NzdjZDgwOTEwZWZiYWI1NzQ3Yw==
GET ws://localhost:8820/ HTTP/1.1
Host: localhost:8820
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: he-IL,he;q=0.8,en-US;q=0.6,en;q=0.4
Sec-WebSocket-Key: Y7a2ZKEz/VCM92Wya49iPA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
//key is already defined.
key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
key = sha1(key);
key = base64_encode(reinterpret_cast<const unsigned char*>(key.c_str()), key.length());

toClient = "HTTP/1.1 101 Switching Protocols\r\n";
toClient += "Upgrade: websocket\r\n";
toClient += "connection: Upgrade\r\n";
toClient += "Sec-Websocket-Accept: ";
toClient += key; 
toClient += "\r\n\r\n";

sendData(sc, toClient);
<!DOCTYPE HTML>
Chrome请求头:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-Websocket-Accept: NzdkYjg1Y2I4MDRlNTk0OGNmNzI1NzdjZDgwOTEwZWZiYWI1NzQ3Yw==
GET ws://localhost:8820/ HTTP/1.1
Host: localhost:8820
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: he-IL,he;q=0.8,en-US;q=0.6,en;q=0.4
Sec-WebSocket-Key: Y7a2ZKEz/VCM92Wya49iPA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
//key is already defined.
key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
key = sha1(key);
key = base64_encode(reinterpret_cast<const unsigned char*>(key.c_str()), key.length());

toClient = "HTTP/1.1 101 Switching Protocols\r\n";
toClient += "Upgrade: websocket\r\n";
toClient += "connection: Upgrade\r\n";
toClient += "Sec-Websocket-Accept: ";
toClient += key; 
toClient += "\r\n\r\n";

sendData(sc, toClient);
<!DOCTYPE HTML>
服务器代码:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-Websocket-Accept: NzdkYjg1Y2I4MDRlNTk0OGNmNzI1NzdjZDgwOTEwZWZiYWI1NzQ3Yw==
GET ws://localhost:8820/ HTTP/1.1
Host: localhost:8820
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: he-IL,he;q=0.8,en-US;q=0.6,en;q=0.4
Sec-WebSocket-Key: Y7a2ZKEz/VCM92Wya49iPA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
//key is already defined.
key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
key = sha1(key);
key = base64_encode(reinterpret_cast<const unsigned char*>(key.c_str()), key.length());

toClient = "HTTP/1.1 101 Switching Protocols\r\n";
toClient += "Upgrade: websocket\r\n";
toClient += "connection: Upgrade\r\n";
toClient += "Sec-Websocket-Accept: ";
toClient += key; 
toClient += "\r\n\r\n";

sendData(sc, toClient);
<!DOCTYPE HTML>
//已定义密钥。
键+=“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”;
key=sha1(key);
key=base64_编码(reinterpret_cast(key.c_str()),key.length());
toClient=“HTTP/1.1 101交换协议\r\n”;
toClient+=“升级:websocket\r\n”;
toClient+=“连接:升级\r\n”;
toClient+=“Sec Websocket接受:”;
toClient+=密钥;
toClient+=“\r\n\r\n”;
sendData(sc、toClient);
客户端代码:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-Websocket-Accept: NzdkYjg1Y2I4MDRlNTk0OGNmNzI1NzdjZDgwOTEwZWZiYWI1NzQ3Yw==
GET ws://localhost:8820/ HTTP/1.1
Host: localhost:8820
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: he-IL,he;q=0.8,en-US;q=0.6,en;q=0.4
Sec-WebSocket-Key: Y7a2ZKEz/VCM92Wya49iPA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
//key is already defined.
key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
key = sha1(key);
key = base64_encode(reinterpret_cast<const unsigned char*>(key.c_str()), key.length());

toClient = "HTTP/1.1 101 Switching Protocols\r\n";
toClient += "Upgrade: websocket\r\n";
toClient += "connection: Upgrade\r\n";
toClient += "Sec-Websocket-Accept: ";
toClient += key; 
toClient += "\r\n\r\n";

sendData(sc, toClient);
<!DOCTYPE HTML>


函数WebSocketTest()
{
如果(“窗口中的WebSocket”)
{
//警报(“您的浏览器支持WebSocket!”);
//让我们打开一个web套接字
var ws=newwebsocket(“ws://localhost:8820”);
控制台日志(“测试”);
ws.onopen=函数()
{
警报(“连接”)
//已连接Web套接字,请使用send()发送数据
发送(“20304user04user04user”);
//警报(“消息已发送…”);
};
ws.onmessage=函数(evt)
{ 
收到的var_msg=evt.data;
警惕(“嘿”);
};
ws.onclose=function()
{ 
//websocket已关闭。
警报(“连接已关闭…”);
};
}
其他的
{
//浏览器不支持WebSocket
警报(“您的浏览器不支持WebSocket!”);
}
}



我试图手动生成响应:

  • 串联的原始sha1摘要字节是
    77db85cb804e5948cf72577cd80910efbab5747c
  • 以64为基数的字节:
    d9uFy4BOWUjPcld82AkQ77q1dHw=

  • 这和你的不同。您正在将这些字节的十六进制字符串表示形式转换为基数64,而不是将原始字节转换为基数64。

    您是否应该连接wss而不是ws?我看不出这样做的理由,我的代码应该可以工作,你还有什么建议吗?你能分享开发者工具网络握手的请求-响应标题吗?我用请求和响应标题更新了这个问题。这可能不相关,但来自服务器的响应连接标题:
    connection:Upgrade
    应该以大写字母
    connection:升级
    所以我对base64使用了这个方法,我觉得这很好,我想我没有真正得到problem@FlyingNadesbase64编码不是问题所在。您的sha1函数是。检查一个类似的问题。这可能会让你的问题更清楚。@gre_gor所以sha1或base64函数都不是问题,我发送给base64函数的sha1表示是问题,对吗?@gre_gor,而且,如果你愿意帮助我,我想知道我如何在cpp中做到这一点,我已经搜索太久了。@FlyingNades,如果将cpp代码中的响应硬编码设置为d9uFy4BOWUjPcld82AkQ77q1dHw=是否有效?