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

XML Daten streamen

Scheduled Pinned Locked Moved Unsolved German
4 Posts 2 Posters 1.4k Views 1 Watching
  • 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.
  • G Offline
    G Offline
    Guju
    wrote on 19 Feb 2017, 12:02 last edited by koahnig
    #1

    Hallo!
    Ich würde gerne von meinem Client Daten von einem Server empfangen. Der Server verschickt regelmäßig XML Text(zb. Server Zeit). Wenn ich mich als Client verbinde, und zb ALL schicke, dann sendet er unterschiedlich viele Informationen in unterschiedlichen Größen.
    Wenn ich in meinem Client eine Verbindung mit dem Server erstelle und ALL schreibe, dann bekomme ich den ersten Datensatz.

    //socket->connectToHost(Server, Port);
       if(socket->waitForConnected(3000))
        {
            qDebug() << "Connected!";
            socket->write("<all/>");
            socket->waitForBytesWritten(1000);
            socket->waitForReadyRead(3000);
            qDebug() << "Reading: " << socket->bytesAvailable();
            qDebug() << socket->readAll();
            socket->close();
            return "Connected";
        }
    

    So weit so gut. Nun dachte ich, dass ich alle Daten empfangen kann, welche der Server schickt, stelle ich auf eine Signal Slot Kommunikation um. Ich dachte, dass ich mit dem Signal ReadRead die Information erhalte, wenn neue Daten verfügbar sind und ich diese verarbeiten kann:

    connect(socket, SIGNAL(connected()),this, SLOT(connected()));
        connect(socket, SIGNAL(disconnected()),this, SLOT(disconnected()));
        connect(socket, SIGNAL(bytesWritten(qint64)),this, SLOT(bytesWritten(qint64)));
        connect(socket, SIGNAL(readyRead()),this, SLOT(readyRead()));
     .... 
     void SocketTest::connected()
    {
        qDebug() << "connected...slot";
        //   socket->write("<all/>");
    } 
        
     void SocketTest::readyRead()
    {
        qDebug() << "Reading: " << socket->bytesAvailable();
        qDebug() << socket->readAll();
    }   
    

    Nur leider funktioniert das überhaupt nicht. Ich habe versucht in den verschiedensten Foren Lösungen zu finden, aber leider schaffe ich es nicht. Sorry, wenn ich euch mit derart langweiligen Fragen nerve. Ich wäre euch wirklich dankbar, wenn ihr mir helfen könnt.....
    Liebe Grüße,
    Jürgen.

    K 1 Reply Last reply 19 Feb 2017, 12:44
    0
    • G Guju
      19 Feb 2017, 12:02

      Hallo!
      Ich würde gerne von meinem Client Daten von einem Server empfangen. Der Server verschickt regelmäßig XML Text(zb. Server Zeit). Wenn ich mich als Client verbinde, und zb ALL schicke, dann sendet er unterschiedlich viele Informationen in unterschiedlichen Größen.
      Wenn ich in meinem Client eine Verbindung mit dem Server erstelle und ALL schreibe, dann bekomme ich den ersten Datensatz.

      //socket->connectToHost(Server, Port);
         if(socket->waitForConnected(3000))
          {
              qDebug() << "Connected!";
              socket->write("<all/>");
              socket->waitForBytesWritten(1000);
              socket->waitForReadyRead(3000);
              qDebug() << "Reading: " << socket->bytesAvailable();
              qDebug() << socket->readAll();
              socket->close();
              return "Connected";
          }
      

      So weit so gut. Nun dachte ich, dass ich alle Daten empfangen kann, welche der Server schickt, stelle ich auf eine Signal Slot Kommunikation um. Ich dachte, dass ich mit dem Signal ReadRead die Information erhalte, wenn neue Daten verfügbar sind und ich diese verarbeiten kann:

      connect(socket, SIGNAL(connected()),this, SLOT(connected()));
          connect(socket, SIGNAL(disconnected()),this, SLOT(disconnected()));
          connect(socket, SIGNAL(bytesWritten(qint64)),this, SLOT(bytesWritten(qint64)));
          connect(socket, SIGNAL(readyRead()),this, SLOT(readyRead()));
       .... 
       void SocketTest::connected()
      {
          qDebug() << "connected...slot";
          //   socket->write("<all/>");
      } 
          
       void SocketTest::readyRead()
      {
          qDebug() << "Reading: " << socket->bytesAvailable();
          qDebug() << socket->readAll();
      }   
      

      Nur leider funktioniert das überhaupt nicht. Ich habe versucht in den verschiedensten Foren Lösungen zu finden, aber leider schaffe ich es nicht. Sorry, wenn ich euch mit derart langweiligen Fragen nerve. Ich wäre euch wirklich dankbar, wenn ihr mir helfen könnt.....
      Liebe Grüße,
      Jürgen.

      K Offline
      K Offline
      koahnig
      wrote on 19 Feb 2017, 12:44 last edited by
      #2

      @Guju

      Hallo

      das Problem bei readyRead. Wie du schon erkannt hast, wird readyRead ausgelöst, wenn Daten ankommen. Allerdings kann kein TCP-Handler in die Zukunft schauen wann alle Daten empfangen sind. Daher wird das readyRead am Anfang ausgelöst. Wann das genau ist, lässt sich auch nicht vorhersagen und hängt von Belastung deiner CPU und auch der event-Loop deiner Applikation ab. Sehr kurze Datenpakete können schon vollständig empfangen sein, allerdings kann dies sehr oft der Fall, aber eine Garantie gibt es nicht.

      Wenn du schon die Grösse des zuerwartenden Datenpaket weisst, kannst du zum Beispiel mit bytesAvailable überprüfen ob alle Daten empfangen und gegebenenfalls warten. Mit xml-Daten hast du manchmal den Fall, dass du die Grösse des Rests des Paktes weisst. Ansonsten musst dir eventuell eine Lösung mit einem Zwischenpuffer überlegen.

      Vote the answer(s) that helped you to solve your issue(s)

      1 Reply Last reply
      0
      • G Offline
        G Offline
        Guju
        wrote on 19 Feb 2017, 21:52 last edited by
        #3

        Hallo!
        Wenn ich das ganze synchron programmiere(while Schleife), dann bekomme ich die Signale und alles funktioniert. Da ich mit der GUI aber eine asynchrone Ausführung benötige, hänge ich....ich finde leider auch keine Beispiele, wie ich das umsetzten kann. Hast du da eventuell eine Idee. Danke für deine Hilfe! Bis dann....

        K 1 Reply Last reply 20 Feb 2017, 17:36
        0
        • G Guju
          19 Feb 2017, 21:52

          Hallo!
          Wenn ich das ganze synchron programmiere(while Schleife), dann bekomme ich die Signale und alles funktioniert. Da ich mit der GUI aber eine asynchrone Ausführung benötige, hänge ich....ich finde leider auch keine Beispiele, wie ich das umsetzten kann. Hast du da eventuell eine Idee. Danke für deine Hilfe! Bis dann....

          K Offline
          K Offline
          koahnig
          wrote on 20 Feb 2017, 17:36 last edited by
          #4

          @Guju

          @koahnig said in XML Daten streamen:

          Ansonsten musst dir eventuell eine Lösung mit einem Zwischenpuffer überlegen.

          Hier steht schon der Vorschlag. Alles herauslesen und im Zwischenpuffer ablegen. Vorsicht ist eventuell nur geboten wegen des Auslösen des Signals geboten. Soweit ich weiss wird kein weiteres Signal ausgelöst solange du in im entsprechenden Slot beschäftigt bist. Daher sollte man nochmals am Ende überprüfen ob nicht der Rest schon da ist. Allerdings ist mit readAll das Problem eher marginal.

          Vote the answer(s) that helped you to solve your issue(s)

          1 Reply Last reply
          0

          1/4

          19 Feb 2017, 12:02

          • Login

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