QWebSocket от QTcpSocket

Я написал небольшой веб-сервер с использованием QTcpServer и т. Д. Он работает нормально, поэтому я хотел немного углубиться и реализовать функциональность Qt WebSocket. Я хочу, чтобы WebSocket-Server был доступен на том же порту, что и мой веб-сервер (из-за ограничений в сети моих клиентов).

Мой WebSocket-сервер должен быть доступен по адресу /admin/socket поэтому мне нужен способ "обновить" QTcpSocket (доступный из обработчика запросов для /admin/socket ) в QWebSocket. QWebSocket имеет эту функциональность в этом конструкторе, который используется этим методом обновления в QWebSocketServerPrivate, но он является частным и используется только внутри QWebSocketServer.

Есть ли способ добиться того, что я описал выше? Должен ли я реализовать свой собственный обработчик WebSocket?

2 ответа

Решение

Вам нужно скопировать необходимые файлы из исходников Qt в ваш проект, обернуть QWebSocket в пространство имен, чтобы он не конфликтовал с собственным Qt и не делал конструктор закрытым. Это единственный способ достичь этого без написания большого количества собственного кода и без вызова неопределенного поведения.

Чтобы использовать ваш тип, сделайте его видимым через using; это скроет Qt's ::QObject затем:

#include <QtCore>

namespace Foo { class QObject {}; }

int main() {
   using Foo::QObject;

   //         ours vvvvvvv        Qt's vvvvvvv
   Q_ASSERT(sizeof(QObject) < sizeof(::QObject));
}

Qt поставляется с исходным кодом по причине: вы должны использовать его, когда это имеет смысл!

На самом деле вы также можете использовать свой собственный веб-сервер. Вы не должны использоватьlistenэто потому, что ваш собственный сервер уже прослушивает какой-то порт. Вместо этого вы просто звонитеhandleConnectionэтого экземпляра и передать его из какого-либо запроса вместо того, чтобы позволить запросу обрабатываться вашим собственным сервером.

Проблема в том, чтоQWebSocketServer::handleConnectionожидает, что из него не были прочитаны никакие данные для доступа к методу TCP-запроса, URL-адресу и заголовкам. Но поскольку вы не хотите передавать все сокеты в , вам нужны данные из , примите решение (обрабатывать их собственным сервером или позволить обрабатывать их), например, выполнив поискUpgrade: websocket(без учета регистра) или путем проверки URL-адреса. Тогда вы можете либо передатьQTcpSocketна вашQWebSocketServerэкземпляр или выполните собственный обработчик для обычных ответов HTTP. Если вы уже полностью прочитали заголовок HTTP, используяpeek, вы можете просто позвонитьskipв розетке в последнем случае.

Другие вопросы по тегам