QWebSocket in C++
-
Hallo,
ich versuche gerade per QWebSocket eine WebSocketverbindung zu einem Rechner aufzubauen. Dafür habe ich mir die Beispiele in der QT Doku angeschaut aber irgend etwas mache ich falsch.
Wenn ich das ganze per QML mache funktioniert alles prima: Verbindung wird hergestellt, die Nachricht verschickt und die Antwort wird in das Textfeld was ich definiert habe eingetragen.
WebSocket { id: socket url: "ws://192.168.100.94:53577/mClient" active: true onTextMessageReceived: { textfield.text = message } onStatusChanged: { if (socket.status == WebSocket.Error) { console.log("Error: " + socket.errorString) } else if (socket.status == WebSocket.Open) { // textfield.text = "connected" socket.sendTextMessage("{\"Name\":\"GetInfos\",\"Type\":\"Request\",\"parameter\":[]}") } else if (socket.status == WebSocket.Closed) { text += "\nSocket closed" } } }
Da ich die Daten aber noch in C++ verarbeiten möchte habe ich versucht nun das gleiche System in C++ aufzubauen und dabei funktioniert auf einmal nichts mehr.
Ich habe nach aktuellem Stand die Klasse "Connection" angelegt
Header:
#ifndef CONNECTION_H #define CONNECTION_H #include <QObject> #include <QtCore> #include <QWebSocket> #include <QDebug> class Connection : public QObject { Q_OBJECT public: explicit Connection(QUrl url, QObject *parent = nullptr); signals: public slots: void textMessageReceived(QString message); private: QWebSocket *m_webSocket; QUrl m_url; }; #endif // CONNECTION_H
Dazu die cpp:
#include "connection.h" Connection::Connection(QUrl url, QObject *parent) : QObject(parent), m_url(url) { QWebSocket *m_webSocket = new QWebSocket; connect(m_webSocket, &QWebSocket::textMessageReceived, this, &Connection::textMessageReceived); m_webSocket->open(url); m_webSocket->sendTextMessage("{\"Name\":\"GetCanvasInfos\",\"Type\":\"Request\",\"parameter\":[]}"); } // Nachricht eingetroffen void Connection::textMessageReceived(QString message) { qDebug() << "incomming data"; qDebug() << "Status der Websocket-Verbindung:" << m_webSocket->state(); qDebug() << "Peer Address:" << m_webSocket->peerAddress(); qDebug() << "Peer Port:" << m_webSocket->peerPort(); qDebug() << "Peer Name:" << m_webSocket->peerName(); qDebug() << "Received Message:" << message; }
Aufgerufen wird die Klasse in der Main mit
Connection connection(QUrl(QStringLiteral("ws://192.168.100.94:53577/mClient")));
Wenn ich mir direkt im Construktor per QDebug den Status ausgeben lasse bekomme ich ein "Connecting", aber scheinbar ist das ganze nicht erfolgreich. Eine Möglichkeit ein "waitForConnected()" wie beim QTcpSocket habe ich auch nicht gefunden.
Bis zur textMessageReceived() Funktion kommt das Programm garnicht, daher nehme ich an das der Verbindungsaufbau bereits Probleme bereitet.
Ich hoffe das mir hier jemand einen Tipp geben kann wo mein Verständnisproblem liegt.
Besten Dank im voraus
Marco
-
Ich habe gerade (erfolglos) noch etwas Weiter gebaut in der Hoffnung das ich eine Verbindung sauber erstellen kann indem ich im Konstruktor nur das websocket->open () ausführe und per Connected Signal das übertragen nach dem Verbindungsaufbau erledige.
Scheinbar habe ich immernoch einen Denkfehler weil keine Verbindung zu stande kommt.
Wäre toll wenn jemand einen Denkanstoß für mich hätte.
die geänderte ccp (meine ganzen DebugStatements habe ich entfernt zur besseren Lesbarkeit):
#include "connection.h" Connection::Connection(QUrl url, QObject *parent) : QObject(parent), m_url(url) { QWebSocket *m_webSocket = new QWebSocket; connect(m_webSocket, &QWebSocket::textMessageReceived, this, &Connection::textMessageReceived); connect(m_webSocket, &QWebSocket::connected, this, &Connection::connected); m_webSocket->open(url); } // Nachricht eingetroffen void Connection::textMessageReceived(QString message) { qDebug() << "Received Message:" << message; } void Connection::connected() { qDebug() << "Status der Websocket-Verbindung:" << m_webSocket->state(); m_webSocket->sendTextMessage("TestMessage"); }
-
Nach langem hin und her habe ich es rausgefunden. Davon ab das ich einen Tippfehler beim erstellen des QWebSocketObjekts "m_webSocket" hatte war der größere Fehler scheinbar das ich einen Connect vergessen hatte.
Auch wenn der Connect mit dem Error aktuell nicht funktioniert (und deswegen fehlt) scheint es seit dem Eintragen des Disconnect zu funktionieren.
Hier nochmal der jetzt bei mir funktionierende Code (wieder ohne die ganzen Debugmeldungen)
#include "connection.h" Connection::Connection(QUrl &url, QObject *parent) : QObject(parent), m_url(url) { m_webSocket = new QWebSocket; connect(m_webSocket, &QWebSocket::connected, this, &Connection::onConnected); connect(m_webSocket, &QWebSocket::textMessageReceived, this, &Connection::onTextMessageReceived); connect(m_webSocket, &QWebSocket::disconnected, this, &Connection::onDisconnected); m_webSocket->open(url); } // Nachricht eingetroffen void Connection::onTextMessageReceived(QString message) { qDebug() << "Received Message:" << message; emit onMessageReceived(message); } void Connection::onConnected() { qDebug() << "Client connected!"; m_webSocket->sendTextMessage("{\"Name\":\"GetCanvasInfos\",\"Type\":\"Request\",\"parameter\":[]}"); } void Connection::Error(QString error) { qDebug() << "Error occured" << error; } void Connection::onDisconnected() { qDebug() << "Websocket - Disconnected!"; }
Hoffe es hilft vielleicht jemand der das gleiche Problem hat wie ich
Gruß
Marco
Wenn jemand einen Tipp hat wie ich den Connect mit der Fehlermeldung hin bekomme bin ich dankbar.
ich hatte es versucht mit:
connect(m_webSocket, &QWebSocket::error, this, &Connection::Error);
und dem Slot:
void Connection::Error(QAbstractSocket::SocketError error) { qDebug() << "Error occured" << error; }
-
@Throndar said in QWebSocket in C++:
connect(m_webSocket, &QWebSocket::error, this, &Connection::Error);
Was genau ist das Problem damit? Compilerfehler? Wenn ja -> http://doc.qt.io/qt-5/qtglobal.html#qOverload