Wie zu Lesen, die kompletten Daten in QTcpSocket?
Nun den server (mit java implementiert) senden einige stream-Daten zu mir, mein code ist wie folgt:
connect(socket, SIGNAL(readyRead()), this, SLOT(read_from_server()));
in der read_from_server()
:
{
while (socket->bytesAvailable())
{
QString temp = socket->readAll();
}
}
aber ich finde, dass auch der server schickte mir einen string mit nur mehrere Zeichen, werden die Daten abgeschnitten, und meine Funktion wird zweimal aufgerufen, so temp
ist die nie die kompletten Daten, die ich will.
Wenn der server schickt mir eine längere Zeichenfolge, die Funktion kann aufgerufen werden, die drei oder mehr mal, was mich diffficult zu wissen, zu welcher Zeit die Daten vollständig übertragen.
Also wer kann mir sagen, wie vollständig die Daten empfangen problemlos, ohne so viele Schritte belästigen? Tut mir Leid, wenn diese doppelt vorhanden ist, mit einigen Fragen anders, ich konnte nicht Ihre Antworten, die für mich arbeiten. Vielen Dank!
InformationsquelleAutor yakiang | 2013-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie sehen, ist normal für client-server-Kommunikation. Die Daten werden in Pakete und die readyRead signal informiert das Programm, das die Daten verfügbar ist, hat aber keine Vorstellung, was oder wie viel Daten es gibt, so haben Sie, um diese zu bewältigen.
Die Daten nicht korrekt Lesen, Sie brauchen einen Puffer, wie erwähnt von @ratchetfreak, zum Anhängen der bytes, wie Sie aus dem stream gelesen. Es ist wichtig, dass Sie wissen, das format der gesendeten Daten, um zu wissen, wenn Sie haben, eine vollständige Nachricht. Ich habe zuvor mindestens zwei Methoden, dies zu tun: -
1) stellen Sie Sicher, dass die gesendeten Nachrichten beginnen mit der Größe, in bytes, der die Nachricht gesendet wird. Auf Empfang von Daten beginnen Sie mit dem Lesen von der Größe und halten Sie Anhängen, um Ihren Puffer, bis es beläuft sich auf die Größe zu erwarten.
2) Senden Sie alle Daten in einem bekannten format, wie JSON oder XML, die überprüft werden können, für das Ende der Nachricht. Zum Beispiel, im Fall von JSON, alle Pakete beginnen mit einer öffnenden Klammer '{' und enden mit einer schließenden Klammer '}', so könnte man Klammern zählen und entsprechen den Daten, oder verwenden Sie QJsonDocument::fromRawData, um zu überprüfen, dass die Daten vollständig sind.
Genutzt haben diese beiden Methoden, die ich empfehle, mit dem ersten; die Größe der Nachricht, die gesendet wird.
Ich Stimme Ihnen vollkommen zu, Sie würde zu sich nehmen müssen, berücksichtigt und überprüft werden, die für Zeichenfolgen zu, aber ich habe erwähnt, mit QJsonDocument um die Daten zu verifizieren. Dank für die Hervorhebung dieser ;O)
Vielen Dank für Ihre Erfahrung!
Du bist herzlich willkommen ;O)
einfache Antwort: ja. Allerdings könnten Sie schicken einzelne Json-Objekte zu und prüfen für Sie nicht abgeschlossen, der Aufbau der QJsonDocument mit jedem Objekt, aber du bist wahrscheinlich besser dran kleben mit dem Aufbau wird das gesamte Dokument in einem byte-array zuerst.
InformationsquelleAutor TheDarkKnight
Wenn alle Daten, die noch nicht angekommen ist dann deine while-Schleife vorzeitig beenden. Sie benötigen, um ein Nachrichtenformat, mit denen der Empfang-code bestimmen, wenn die komplette Nachricht empfangen wurde. Zum Beispiel kann die Nachricht beginnt mit einem Länge-element, oder wenn Sie den Umgang mit text die Nachricht konnte am Ende mit einigen Zeichen verwendet, als terminator.
InformationsquelleAutor ScottMcP-MVP
können Sie einen Puffer-Bereich zu halten, die unfertigen Daten vorübergehend und behandeln Pakete, wie Sie komplette:
InformationsquelleAutor ratchet freak
Problem ist, dass während der tcp-Daten-übertragung Daten senden Undefinierte Brocken. Wenn Sie versuchen, zu Lesen block definiert die Größe, die Sie haben, um zu wissen, im Voraus erwartet chunk-Größe oder Weise bestimmt, wenn Ihr block endet (so etwas wie " null-terminierte c-Strings).
Prüfen, ob diese Antwort nicht helfen (gibt es einen trick, um das warten für die zu erwartenden Daten-block).
InformationsquelleAutor Marek R