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