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
в розетке в последнем случае.