XML Daten streamen
-
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. -
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.
-
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.... -
@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.