Почему Firefox говорит, что «не может установить соединение с сервером по адресу ws: // localhost: 3000 /» после успешного запроса на возврат обновления? - PullRequest
0 голосов
/ 03 июля 2019

Я написал программу на 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 и без него, потому что я прочитал его в ответ на вопрос, который я не понял, и который сейчас не могу найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...