Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. QWebSocket in C++
Forum Updated to NodeBB v4.3 + New Features

QWebSocket in C++

Scheduled Pinned Locked Moved Solved German
4 Posts 2 Posters 1.1k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    T Offline
    Throndar
    wrote on last edited by Throndar
    #1

    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

    1 Reply Last reply
    0
    • T Offline
      T Offline
      Throndar
      wrote on last edited by
      #2

      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");
      }
      
      
      1 Reply Last reply
      0
      • T Offline
        T Offline
        Throndar
        wrote on last edited by Throndar
        #3

        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;
        }
        
        1 Reply Last reply
        0
        • Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @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

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          1 Reply Last reply
          1

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved