Что нужно:
Использовать один и тот же порт для http и websocket.
Некоторое время назад у меня возникла проблема, описанная в QTBUG-121562 (QHttpServer не выдает новое соединение WebSocket() с myclass::myslot()), которое было решено (до Qt 6.7.x) с помощью решения, предложенного Евгением Мещеряковым:
Но теперь (Qt6.8.0) я получил ошибку при компиляции и больше не работает:
Сбой статического утверждения: ошибка аргументов ViewHandler: QHttpServerResponder можно передать только как ссылку .
Я это сделал в Qt 6.8.0:
httpServer->route("/ws/", [](QHttpServerResponder &respond) {
//httpServer->route("/ws/", [](QHttpServerResponder &&respond) { // here compiler gives error in Qt 6.8.0
auto _respond = std::move(respond);
});
Это устранило ошибку компилятора, но СИГНАЛ больше не генерируется.
Я не знаю, ошибка это или просто изменение как работает Qt6.8.0.
Пример кода ниже работает нормально в Qt 6.7.2, но НЕ в 6.8.0 и 6.8.1.
Проверьте ===>> #если (QT_VERSION < QT_VERSION_CHECK(6, 8, 0))
Порты: 4445 (только веб-сокет) и 8001 (http и один и тот же порт веб-сокета).
Используйте localhost:8001 для http сервер (index.html), а проект должен указывать на основную папку проекта.
httpsocketlistener.h
#ifndef HTTPSOCKETLISTENER_H
#define HTTPSOCKETLISTENER_H
#include
#include
#include
#include
#include
#include
class HttpSocketListener : public QObject
{
Q_OBJECT
public:
explicit HttpSocketListener(QObject *parent = nullptr);
~HttpSocketListener();
#if (QT_VERSION < QT_VERSION_CHECK(6, 8, 0))
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
#else
quint16 listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
#endif
void addRoutes(QHttpServer * httpServer);
protected:
signals:
void clientConnected(QWebSocket * newWebSocketConnection);
public slots:
void incomingConnection();
private:
QHttpServer * m_pHttpSocketServer;
};
#endif // HTTPSOCKETLISTENER_H
httpsocketlistener.cpp
#include "httpsocketlistener.h"
#include
#include
#include
#include
HttpSocketListener::HttpSocketListener(QObject *parent)
: QObject{parent}
{
qDebug() listen(address, port) || !m_pHttpSocketServer->bind(tcpserver.get())) {
qDebug() route("/ws/", [](QHttpServerResponder &&respond) {
//httpServer->route("/ws/", [](QHttpServerResponder &respond) { // this compiles, but it does not emit the signal
auto _respond = std::move(respond);
});
#endif
httpServer->route("/json/", [] {
return QJsonObject{
{
{"key1", "1"},
{"key2", "2"},
{"key3", "3"}
}
};
});
httpServer->route("/api/", [] {
return QJsonObject{
{
{"Api_1", "1"},
{"Api_2", "2"},
{"Api_3", "3"}
}
};
});
}
websocketlistener.h
#ifndef WEBSOCKETLISTENER_H
#define WEBSOCKETLISTENER_H
#include
#include
#include
#include
class WebSocketListener : public QObject
{
Q_OBJECT
public:
explicit WebSocketListener(QObject *parent = 0);
~WebSocketListener();
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
protected:
signals:
void clientConnected(QWebSocket * newWebSocketConnection);
public slots:
void incomingConnection();
private:
QPointer m_pWebSocketServer;
};
#endif // WEBSOCKETLISTENER_H
websocketlistener.cpp
#include "websocketlistener.h"
WebSocketListener::WebSocketListener(QObject *parent) :
QObject(parent)
{
qDebug() nextPendingConnection();
qDebug() listen( QHostAddress::AnyIPv4, websocketlistenPort ) ){
qDebug() listen( QHostAddress::AnyIPv4, httpsocketlistenPort ) ){
qDebug()
Подробнее здесь: https://stackoverflow.com/questions/793 ... smyslot-an
QHttpServer 6.8.0 больше не отправляет newWebSocketConnection() в myclass::myslot() ⇐ C++
Программы на C++. Форум разработчиков
1736691829
Anonymous
Что нужно:
Использовать один и тот же порт для http и websocket.
Некоторое время назад у меня возникла проблема, описанная в QTBUG-121562 (QHttpServer не выдает новое соединение WebSocket() с myclass::myslot()), которое было решено (до Qt 6.7.x) с помощью решения, предложенного Евгением Мещеряковым:
Но теперь (Qt6.8.0) я получил ошибку при компиляции и больше не работает:
Сбой статического утверждения: ошибка аргументов ViewHandler: QHttpServerResponder можно передать только как ссылку .
Я это сделал в Qt 6.8.0:
httpServer->route("/ws/", [](QHttpServerResponder &respond) {
//httpServer->route("/ws/", [](QHttpServerResponder &&respond) { // here compiler gives error in Qt 6.8.0
auto _respond = std::move(respond);
});
Это устранило ошибку компилятора, но СИГНАЛ больше не генерируется.
Я не знаю, ошибка это или просто изменение как работает Qt6.8.0.
Пример кода ниже работает нормально в Qt 6.7.2, но НЕ в 6.8.0 и 6.8.1.
Проверьте ===>> #если (QT_VERSION < QT_VERSION_CHECK(6, 8, 0))
Порты: 4445 (только веб-сокет) и 8001 (http и один и тот же порт веб-сокета).
Используйте localhost:8001 для http сервер (index.html), а проект должен указывать на основную папку проекта.
httpsocketlistener.h
#ifndef HTTPSOCKETLISTENER_H
#define HTTPSOCKETLISTENER_H
#include
#include
#include
#include
#include
#include
class HttpSocketListener : public QObject
{
Q_OBJECT
public:
explicit HttpSocketListener(QObject *parent = nullptr);
~HttpSocketListener();
#if (QT_VERSION < QT_VERSION_CHECK(6, 8, 0))
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
#else
quint16 listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
#endif
void addRoutes(QHttpServer * httpServer);
protected:
signals:
void clientConnected(QWebSocket * newWebSocketConnection);
public slots:
void incomingConnection();
private:
QHttpServer * m_pHttpSocketServer;
};
#endif // HTTPSOCKETLISTENER_H
httpsocketlistener.cpp
#include "httpsocketlistener.h"
#include
#include
#include
#include
HttpSocketListener::HttpSocketListener(QObject *parent)
: QObject{parent}
{
qDebug() listen(address, port) || !m_pHttpSocketServer->bind(tcpserver.get())) {
qDebug() route("/ws/", [](QHttpServerResponder &&respond) {
//httpServer->route("/ws/", [](QHttpServerResponder &respond) { // this compiles, but it does not emit the signal
auto _respond = std::move(respond);
});
#endif
httpServer->route("/json/", [] {
return QJsonObject{
{
{"key1", "1"},
{"key2", "2"},
{"key3", "3"}
}
};
});
httpServer->route("/api/", [] {
return QJsonObject{
{
{"Api_1", "1"},
{"Api_2", "2"},
{"Api_3", "3"}
}
};
});
}
websocketlistener.h
#ifndef WEBSOCKETLISTENER_H
#define WEBSOCKETLISTENER_H
#include
#include
#include
#include
class WebSocketListener : public QObject
{
Q_OBJECT
public:
explicit WebSocketListener(QObject *parent = 0);
~WebSocketListener();
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
protected:
signals:
void clientConnected(QWebSocket * newWebSocketConnection);
public slots:
void incomingConnection();
private:
QPointer m_pWebSocketServer;
};
#endif // WEBSOCKETLISTENER_H
websocketlistener.cpp
#include "websocketlistener.h"
WebSocketListener::WebSocketListener(QObject *parent) :
QObject(parent)
{
qDebug() nextPendingConnection();
qDebug() listen( QHostAddress::AnyIPv4, websocketlistenPort ) ){
qDebug() listen( QHostAddress::AnyIPv4, httpsocketlistenPort ) ){
qDebug()
Подробнее здесь: [url]https://stackoverflow.com/questions/79336787/qhttpserver-6-8-0-does-not-emit-newwebsocketconnection-to-myclassmyslot-an[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия