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;
    }
    

  • Qt Champions 2018

    @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


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.