QSocket und Daten übertragen

Alles rund um die Programmierung mit Qt
Antworten
derbernd
Beiträge: 3
Registriert: 5. März 2013 10:21

QSocket und Daten übertragen

Beitrag von derbernd »

Hallo,

ich möchte einige Daten mittels eines Tcp-Socket vom Server an einen Client übertragen. Der Client führt dann umfängliche Berechnungen aus und soll die Ergebnisse an den Server senden. Ich bin ein Neuling beim Programmieren und könnte etwas Hilfe gebrauchen.

Momentan speichere ich mir auf dem Server die Übergabewerte in einem 2D-QVector. Weiterhin werden einige zusätzliche Daten in Form von double-Werten benötigt. Wie übertrage ich die unterschiedlichen Daten am Besten zu dem Client? Hatte an einen QDataStream gedacht, bekomme das aber nicht programmiert. Würde das prinzipiell funktionieren oder gibt es eine einfachere Lösung. Einen einzelnen String, double oder int kann man ja mittels QByteArray übertragen. Würde dies auch mit einer komplexeren Struktur funktionieren?

Danke
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Re: QSocket und Daten übertragen

Beitrag von sigvdr »

Hast du das zu QDataStream schon gelesen?
http://qt-project.org/doc/qt-5/datastreamformat.html

Gruß Sig
derbernd
Beiträge: 3
Registriert: 5. März 2013 10:21

Re: QSocket und Daten übertragen

Beitrag von derbernd »

gelesen ja und nach meinem Verständnis würde es ja gehen. Nur bekomme ich es nicht hin Daten zu senden. Mit hoher Wahrscheinlichkeit liegt es an meinem Programm. Eh ich mich jedoch zu lange damit beschäftige, wollte ich wissen ob man prinzipiell Daten per QDataStream über einen Socket versenden kann.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QSocket und Daten übertragen

Beitrag von RHBaum »

Zu den Begrifflichkeiten:

Für Qt:
Streams sind eine Abstraktion eines typisierten Datenflusses ....
IODevices sind die Abstraktion von "devices" die binäre Daten asynchron versenden und Empfangen können.

Für STL (standard c++)
IOStreams sind die Abstraktion eines Typisierten Datenflusses kombiniert (generisch erweitert) durch ein Device was Daten senden und empfangen kann.

Also bei der STL bekommst du mittels einem
std::fstream schon beides, und kannst nach dem Öffnen sofort loslegen.

Bei der Qt musst der QDatastream das IO device mitbekommen (Konstruktor)

Was macht nen QDatastream genau ?
Es implementiert die streamoperatoren << >> für alle gängigen Q-typen. Dabei werden die daten in ein QT spezifisches binäres Format verpackt und dann erst an das IO device übergeben.
du kannst also deine QT Variablen (Typ muss Qt typ oder standard typ sein, den QDatastream unterstützt) einfach so dem QDataStream übergeben, der schickts an das IOdevice, das IODevice auf der gegenseite nimmts wieder raus, gibts wiederum nen QDatastream ..... und aus dem Datastream da kannst es so rausholen wie es auf der anderen seite reingeschrieben hasst.
Strings, Arrays und container werden dabei entsprechend verpackt.

Hauptanwendung vom Datastream ist aber eher die serialisierung als die Kommunikation ...

Warum?
Reader und Writer muessen QDataStream sein, idealer weisse selbe qt version benutzen. DU bist also an qt gefesslt, weil ohne die kannst die daten ned lesen.
Und es ist keine Aufwendige Flusslogik dabei ... daten muessen einfach so gelesen werden wie geschrieben ...
Damit geht rudimentär schon einiges .... aber für komplexere dinge nimmt man dann doch lieber nen höheres Protokoll als TCP.

Und zum debuggen und Plattformunabhaengigkeit (in dem falle gehts aber trotzdem) nimmt man eher textbasierte Protokolle ...

Also ob QDataStream für dich geeignet ist, kommt ganz auf deine Anforderungen an, und wie komplex deine Kommunikation ist.

Ciao ...
derbernd
Beiträge: 3
Registriert: 5. März 2013 10:21

Re: QSocket und Daten übertragen

Beitrag von derbernd »

Danke für die ausführliche Antwort.

Ich möchte letztendlich ca. 80.000 double-Werte an den Client senden. Dieser verarbeitet die Daten und gibt ca. 10.000 double-Werte zurück.

Letztendlich habe ich mir das wie in eine Datei schreiben und wieder lesen vorgestellt.
also: QVector, QString, int -> QDatastream ....(Socket) .... QDataStream - > QVector, QString, int

Oder gibt es noch eine andere Möglichkeit der Übertragung?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QSocket und Daten übertragen

Beitrag von RHBaum »

Oder gibt es noch eine andere Möglichkeit der Übertragung?
Kommt immer drauf an :-)

Die rudimentärste Frage ist, wie fest sind deine auf 80.000 bzw 10.000 basierenden definitionen.
Könnten die Später mal erweitert oder reduziert werden ?
Und vor allem, wie stabil soll das Protokoll sein ...

Also könntest das in QList<double> packen die via QDatastream rüberschicken drüben verarbeiten, und wieder zurückschicken.
bräuchtest nur die Flusskontrolle auf beiden seiten implementieren, also wenn sendet der eine und empfängt und dann andersrum und so das nichts durcheinanderkommt.
Spricht eigentlich nichts dagegen.

Klassisch ohne QT, und wenn auf der anderen seite nicht qt programme, scripts etc das zeugs empfangen und verarbeiten sollen, würde man text nehmen. Zeilenende getriggert und mit KeyWörtern ...

BeginDataTransmission
23536.3543
345.353
45.00
// ... hier der rest der 80 k werte
EndDataTransmission

dann wuerde die gegenstelle berechnen und daten genau so aufm rückkanal zurückschicken

Der text wär unperformanter ....
aber einfacher zu debuggen von ausserhalb (wireshark)
und so ne lösung waere einfacher zu migrieren in ne andere technologie (server, java container ...etc)

Aber wenn das nie vorgesehen ist, keine Rolle spielt, spricht nix gegen die 1. lösung.

Ciao ...
Antworten