成功返回升级请求后,Firefox为什么说“无法在ws:// localhost:3000 /建立与服务器的连接”?

时间:2019-07-03 18:17:39

标签: javascript c++ websocket poco-libraries

我用c ++编写了一个程序,以将HTTP会话升级到WebSocket。服务器正确接收升级请求,并以101个交换协议做出响应。 Firefox收到101响应,但在控制台中声称无法连接。这是Firefox中的完整输出。

Firefox can’t establish a connection to the server at ws://localhost:3000/.

有趣的是,在“网络”选项卡中,您可以看到101响应,因此它确实建立了HTTP连接,服务器获得了该连接,接受了该连接,尝试进行升级,并发送了升级响应,但是它就在那指出firefox无法升级到WebSocket并显示错误。enter image description here

我也在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参数,因为我在回答我不了解的问题(现在找不到)时回答了该问题。

0 个答案:

没有答案