我用c ++编写了一个程序,以将HTTP会话升级到WebSocket。服务器正确接收升级请求,并以101个交换协议做出响应。 Firefox收到101响应,但在控制台中声称无法连接。这是Firefox中的完整输出。
有趣的是,在“网络”选项卡中,您可以看到101响应,因此它确实建立了HTTP连接,服务器获得了该连接,接受了该连接,尝试进行升级,并发送了升级响应,但是它就在那指出firefox无法升级到WebSocket并显示错误。
我也在Google Chrome浏览器中尝试过。类似的错误,但细节更多。 WebSocket connection to 'ws://localhost:3000/' failed: Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received
我的代码c ++挂在while循环上,没有引发任何错误,我认为这意味着它认为连接仍在工作?
我确实注意到它正在发送Sec-Websocket-Protocol,即使我只要求ws
,而不是wss
。 Chrome和Firefox会禁止使用不安全的网络套接字吗?还是我的代码中缺少什么?
C ++:
#define PORT (unsigned short) 3000
#define MAX_BUF 2048
int main()
{
Poco::Net::ServerSocket x(PORT);
Poco::Timespan timeout(25000000);
if (x.poll(timeout, 1)) {
Poco::Net::StreamSocket ss = x.acceptConnection();
Poco::AutoPtr<Poco::Net::HTTPServerParams> params = new Poco::Net::HTTPServerParams();
Poco::Net::HTTPServerSession sess(ss,params);
Poco::Net::HTTPServerResponseImpl res(sess);
Poco::Net::HTTPServerRequestImpl req(res, sess, params);
if (req.getMethod()=="GET" && req.get("Upgrade")=="websocket") {
Poco::Net::WebSocket webSock(req,res);
while (!webSock.available());
char buf[MAX_BUF];
memset(buf,0,MAX_BUF);
int flags = 0;
webSock.sendFrame("Hello, World!\n",15);
webSock.receiveFrame(buf,MAX_BUF,flags);
printf("received %s\n",buf);
}
}
else {
printf("Timeout!\n");
}
return 0;
}
Javascript:
$(document).ready(function() {
webSoc = new WebSocket("ws://localhost:3000");
webSoc.onopen = function (event) {
$("#c").click(function () {
console.log("Sending 'Hello, World!'");
webSoc.send("Hello, World!\n");
});
}
});
我尝试过使用new WebSocket("ws://localhost:3000")
参数,是否使用了echo-protocol
参数,因为我在回答我不了解的问题(现在找不到)时回答了该问题。