QT Netzwerkprotokoll

Alles rund um die Programmierung mit Qt
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Wenn du ein String senden und empfangen kannst, wieso kannst du dann keine Informationsstruktur statt einem String senden und empfangen?

Beispiel:
Du sendest ein <jetzt kommt ein bild>, der Empfänger ließt das und merkt sich (dafür gibt's Variablen...), dass als nächstes ein Bild kommt. Danach sendest du Das Bild und ein <jetzt kommt wieder ein Bild>. Oder alternativ <jetzt kommt eine spezielle Information>. Diese kleinen Einlagen (<das da>) muss natürlich immer auf die selbe Art und Weise gelesen werden, im einfachsten Fall als ein Byte. Die Art und Weise, wie die nächsten Daten gelesen werden, oder was sie repräsentieren, weiß er halt aus den vorhergehenden, z.B. aus dem kurz davor gesendeten <was kommt nun> oder aus anderem Kontext.

Damit du nicht mehr über fehlende Praxis plagen kannst:
Wie man einen komplexeren Block mit diversen Daten zusammenhängend senden kann (KANN):

Code: Alles auswählen

  // Hier benutzte Membervariable:
  //   QTcpSocket *m_socket;

  QByteArray block;
  QDataStream out( &block, QIODevice::WriteOnly );
  out << (quint32)0; // Die Größe des Blockes. Wird hier reserviert aber zum Schluss gesetzt.

  // 'out' hier mit Informationsdaten beschreiben.

  out.device()->seek( 0 );
  out << (quint32)(block.size() - sizeof( quint32 ));
  m_socket->write( block );
und im readyRead des Empfängers:

Code: Alles auswählen

  // Hier benutzte Membervariablen:
  //   quint32 m_blockSize;
  //   QTcpSocket *m_socket;

  QDataStream in( m_socket );

  // Blockgröße lesen, falls noch nicht bekannt
  if( m_blockSize == 0 )
  {
    if( m_socket->bytesAvailable() < (int)sizeof( quint32 ) )
      return;
    in >> m_blockSize;
  }
  
  // Warten, bis der komplette Block angekommen ist.
  if( m_socket->bytesAvailable() < m_blockSize )
    return;

  // von 'in' hier die Informationsdaten lesen.
Neo E
Beiträge: 22
Registriert: 23. Juli 2008 17:32

Beitrag von Neo E »

Ich hab es hinbekommen.

@FaS Ich habe es so umgsetzt wie du es beschrieben hast. Also einfach einen Stream schicken in dem ich ansage das im nächsten Stream kommt.

Ich habe gedacht das man das auch in einem Stream machen kann und deshalb auch immer die Frage wie ich den Datenstrom in Kommando und Daten unterteilen bzw. trennen könnte.

Danke für die Hilfe!
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Kannst du doch auch in einem Stream machen, ist dasselbe. Ob du in einem Stream 2 Strings versendest oder erstmal ein String und danach noch einen, sieht beim Empfänger exakt genauso aus. Du kannst doch anfangen den auszulesen, dann steht da ganz am Anfang in einer kleinen ID wie das weiterverarbeitet werden soll.

Gruß,
FaS
Antworten