![Page 1: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/1.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 1
C++ AnwendungskursTag 5: Netzwerkprogrammierung
Sebastian HoubenInstitut fur Neuroinformatikwww.ini.rub.de/research/groups/rtcv/
19.Marz 2018
![Page 2: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/2.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Inhalt
1 Einleitung
2 QtNetwork
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 2
![Page 3: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/3.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Inhalt
1 EinleitungMotivationExkurs: Protokolle
2 QtNetwork
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 3
![Page 4: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/4.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Inhalt
1 EinleitungMotivationExkurs: Protokolle
2 QtNetwork
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 4
![Page 5: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/5.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Netzwerkprogrammierung
Kommunikation zwischen Rechnern
verschiedene Protokolle existieren
Beispiel: Offnen einer Webseite
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 5
![Page 6: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/6.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Netzwerkprogrammierung
Server - Client Peer to Peer
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 6
![Page 7: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/7.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Netzwerkprogrammierung
Server - Client Peer to Peer
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 7
![Page 8: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/8.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Inhalt
1 EinleitungMotivationExkurs: Protokolle
2 QtNetwork
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 8
![Page 9: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/9.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Ubersicht
Folgende Protokolle werden von Qt vorimplementiert:
Http - Client ruft Webseite von Server ab (Layer 7)
Ftp - Client tauscht Daten mit Server aus (Layer 7)
UDP - Verbindungsloses Protokoll zur Ubertragung von Daten(Layer 4)
TCP - Verbindungsorientiertes Protokoll zur Ubertragung von Daten(Layer 4)
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 9
![Page 10: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/10.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Ubersicht
Folgende Protokolle werden von Qt vorimplementiert:
Http - Client ruft Webseite von Server ab (Layer 7)
Ftp - Client tauscht Daten mit Server aus (Layer 7)
UDP - Verbindungsloses Protokoll zur Ubertragung von Daten(Layer 4)
TCP - Verbindungsorientiertes Protokoll zur Ubertragung von Daten(Layer 4)
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 10
![Page 11: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/11.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
UDP
UDP - User Datagram Protocol
Verbindungslos, nicht zuverlassig, ungesichert und ungeschutztes gibt keine Garantie, dass
gesendete Daten auch (vollstandig) ankommendie Reihenfolge der Daten eingehalten wirdgesendete Daten unverfalscht eintreffen(theoretisch nicht, meistens schon)Daten nicht zuganglich fur Dritte sind
sehr effizientes muss nicht erst eine Verbindung aufgebaut werdengehen Daten verloren, werden diese nicht neu angefordert
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 11
![Page 12: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/12.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Aufbau eines UDP-Datagramms
Theoretische maximale Große 65.535 Bytes, meist begrenzt auf 512 Bytes
UDP-Header (96 Bits):
0-31 Quell-IP-Adresse
32-63 Ziel-IP-Adresse
64-71 Leerfeld
72-79 Protokoll-ID (bei UDP 17)
80-95 UDP-Datagramm Lange
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 12
![Page 13: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/13.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
TCP
TCP - Transmission Control Protocol
Verbindungsorientiert, zuverlassig, paketvermittelnd
Datenverluste konnen erkannt und behoben werden
Netzuberlastung kann verhindert werden
Verbindung zwischen zwei Rechnern, Ubertragung in beideRichtungen
Verbindungsauf- und -abbau mittels handshake/teardown
Daten werden eigenstandig in Segmente (Header/Daten) unterteilt
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 13
![Page 14: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/14.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
TCP-Verbindungsauf- und -abbau
TCP-Handshake TCP-Teardown
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 14
![Page 15: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/15.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
TCP-Header
Maximale Große eines TCP-Segments 1500 Bytes (Header 20 Bytes)
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 15
![Page 16: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/16.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Inhalt
1 Einleitung
2 QtNetworkUbersichtQSocketsQTcpServer
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 16
![Page 17: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/17.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Inhalt
1 Einleitung
2 QtNetworkUbersichtQSocketsQTcpServer
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 17
![Page 18: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/18.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Inhalt von QtNetwork
Qt beinhaltet im Modul Network folgende Klassen
QAbstractSocket, QTcpSocket und QUdpSocket -Implementierung des TCP und UDP Protokoll
QTcpServer - Server fur TCP Verbindungen
QHttp und QFtp - Implementierung des HTTP- und FTP-Protokolls
QHostAdress - Klasse u. a. zur Namensauflosung von Adressen
QNetworkProxy - Implementierung der Proxyunterstutzung furHTTP- und FTP-Protokoll
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 18
![Page 19: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/19.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Inhalt von QtNetwork
Qt beinhaltet im Modul Network folgende Klassen
QAbstractSocket, QTcpSocket und QUdpSocket -Implementierung des TCP und UDP Protokoll
QTcpServer - Server fur TCP Verbindungen
QHttp und QFtp - Implementierung des Http und Ftp Protokoll
QHostAdress - Klasse u. a. zur Namensauflosung von Adressen
QNetworkProxy - Implementierung der Proxyunterstutzung fur Httpund Ftp Protokoll
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 19
![Page 20: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/20.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Inhalt
1 Einleitung
2 QtNetworkUbersichtQSocketsQTcpServer
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 20
![Page 21: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/21.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Ubersicht
Sockets bilden die Grundlage zur Ubertragung von Daten uber dasNetzwerkIn Qt sind realisiert:
QUdpSocket
QTcpSocket
Diese erben von der Klassen QAbstractSocket, die ein Interface furSockets bereitstellt.Eigene Sockets fur andere Protokolle konnen implementiert werden, indemvon QAbstractSocket geerbt wird.
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 21
![Page 22: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/22.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
QUdpSocket
Erlaubt das Senden und Empfangen von UDP-DatagrammenFunktionen
bind(): bereitet Socket fur das Empfangen von Daten vor
readyRead(): Signal, Daten bereit zum Lesen
readDatagram(): liest Daten vom Socket
writeDatagram(): schreibt Daten auf den Socket
hasPendingDatagrams(): gibt an, ob sich Daten auf dem Socketbefinden
pendingDatagramSize(): Große der Daten auf dem Socket
mehr Infos → http://doc.qt.io/qt-5/qudpsocket.htmlinsbesondere Argumentlisten der Funktionen
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 22
![Page 23: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/23.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Beispiel - QUdpSocket
Sender#include <QNetwork>QUdpSocket * pUdpSocket = new QUdpSocket(this);
QByteArray datagram = "Broadcast message " + QByteArray::number(messageNo);pUdpSocket->writeDatagram(datagram.data(), datagram.size(),
QHostAddress::Broadcast, 45454);
Empfanger#include <QNetwork>QUdpSocket * pUdpSocket = new QUdpSocket(this);pUdpSocket->bind(QHostAddress::LocalHost, 45454);
while (pUdpSocket->hasPendingDatagrams()){
QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());pUdpSocket->readDatagram(datagram.data(), datagram.size());
}pUdpSocket->deleteLater();
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 23
![Page 24: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/24.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
QTcpSocket
Erlaubt das Senden und Empfangen von Daten uber TCP. Im Unterschiedzu QUdpSocket lauft dies asynchron ab. Aus diesem Grund mussenSignal/Slots genutzt werden.Funktionen
connectToHost(): Verbindung zu Server aufbauen
readyRead(): Signal, Daten bereit zum Lesen
read(): liest Daten vom Socket
write(): schreibt Daten auf den Socket
bytesAvailable(): Große der Daten auf dem Socket
mehr Infos → http://doc.qt.io/qt-5/qtcpsocket.htmlinsbesondere Argumentlisten der Funktionen
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 24
![Page 25: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/25.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Beispiel - QTcpSocket
Um Daten von einem QTcpSocket zu lesen, sollte zum einen bekanntsein, wie groß das Paket der Daten ist, zum anderen sollten Signal/Slotsbenutzt werden.
#include <QNetwork>
QTcpSocket * pTcpSocket = new QTcpSocket();pTcpSocket->connectToHost("192.168.178.21", 9911);QString message = "Dies ist ein Test"; // Nachricht, die gesendet werden sollQByteArray messageToSend; // Datenarray, in das Nachricht geschrieben wirdQDataStream out( &messageToSend, QIODevice::WriteOnly );
out << (quint16)0; // Platzhalter, um spaeter die Groesse der Nachricht festzulegenout << message;out.device()->seek( 0 ); // zu Platzhalter gehen ...out << (quint16)( messageToSend.size() - sizeof( quint16 ) ); // ... und Groesse der Nachricht
einfuegen
pTcpSocket->write( messageToSend ); // Nachricht auf Socket schreibenpTcpSocket->waitForBytesWritten(); // Warten, bis Nachricht geschrieben wurdepTcpSocket->deleteLater();
Wichtig! Manchmal fuhrt waitForBytesWritten() zu einemundefinierten Verhalten. Es ist nicht klar, ob sich das Warten nur auf dasSenden der Daten zum Betriebssystem oder das Schreiben direkt auf denSocket bezieht. Dies ist abhangig vom Betriebssystem.
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 25
![Page 26: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/26.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Beispiel - QTcpSocket
Besser ist es, einen Slot mit dem Signal bytesWritten(qint64) zuverbinden und in einer Membervariablen zu speichern, wie groß die aktuellzu sendende Nachricht ist. Dann wird der verbundene Slot solangeaufgerufen, bis die von byteWritten gelieferte Anzahl an Bytesgenauso groß ist wie die in der Membervariablen. Dann kann der Socketbedenkenlos geloscht werden.
// Code wie ebenQObject::connect( pTcpSocket, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)) );
// Bytes der Nachricht in m_noByes gemerkt....
void MyClass::onBytesWritten( qint64 noBytes ){
if( m_noBytes > noBytes )return;
pTcpSocket->deleteLater();}
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 26
![Page 27: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/27.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Beispiel - QTcpSocket
Daten sollten nur uber den Signal/Slot vom Socket gelesen werden. Hierzubietet es sich an, das Signal readyRead() mit einem Slot seiner Klassezu verbinden.
#include <QNetwork>// innerhalb des Klassen-Headerspublic Q_SLOTS: void onReadyRead();
QTcpSocket * pTcpSocket = new QTcpSocket(); quint16 blocksize = 0;QObject::connect(pTcpSocket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
void MyNetworkClass::onReadyRead(){
QDataStream in(pTcpSocket);if (blocksize == 0) // Groesse der Nachricht wurde noch nicht gelesen{if (pTcpSocket->bytesAvailable() < (int)sizeof(quint16)) //Groesse der Daten auf Socket?
return;in >> blocksize; // Groesse der Daten speichern
}if (pTcpSocket->bytesAvailable() < blocksize) // Warten bis alle Daten dareturn;
QString message;in >> message; // Daten aus Socket lesen
}
Das Signal readyRead() wird solange kontinuierlich gesendet, wieDaten auf dem Socket vorhanden sind.
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 27
![Page 28: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/28.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Inhalt
1 Einleitung
2 QtNetworkUbersichtQSocketsQTcpServer
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 28
![Page 29: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/29.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
QTcpServer
QTcpServer dient zur Verwaltung von Verbindungen mit Clients.Typischerweise hat ein Server mindestens einen QTcpSocket, umNachrichten mit verbundenen Clients auszutauschen. Der Server lauschtauf einem definierten Port und nimmt eingehende Verbindungen an.Funktionen
listen(): lauscht auf definierten PortnewConnection(): Signal, wenn Verbindung eingehtnextPendingConnection(): bearbeitet die nachste VerbindungincomingConnection(): Funktion, die aufgerufen wird, wenneine Verbindung eingeht. Diese ist leer implementiert und mussuberschrieben werdenmaxPendingConnection(): Gibt an, wie viele eingehendeVerbindungen der Server gleichzeitig haben kannserverError(): Fehler konnen hiermit abgerufen werden
mehr Infos → http://doc.qt.io/qt-5/qtcpserver.htmlinsbesondere Argumentlisten der Funktionen
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 29
![Page 30: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/30.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Beispiel - QTcpServer
Header#include <QNetwork>
class MyServer : public QObject{
Q_OBJECTpublic:
MyServer( QObject * parent = 0 );private:
QTcpServer m_tcpServer;public Q_SLOTS:
void sendMessage();};
Der Server beinhaltet ein Objekt vom Typ QTcpServer, um Verbindungenmit Clients zu handlen. Der Server implementiert den Konstruktor und denSlot sendMessage().
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 30
![Page 31: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/31.jpg)
Einleitung QtNetwork Exkurs: QtXML AufgabeUbersicht QSockets QTcpServer
Beispiel - QTcpServer
Implementierung#include "MyServer.h"MyServer::MyServer(QObject * parent) : QObject(parent){
QObject::connect(m_tcpServer, SIGNAL(newConnection()), this, SLOT(sendMessage()));m_tcpServer.listen(QHostAddress::Any, 9911);
}void MyServer::sendMessage(){
QString message = "Dies ist ein Test";QByteArray messageToSend;QDataStream out( &messageToSend, QIODevice::WriteOnly );out << (quint16)0;out << message;out.device()->seek( 0 );out << (quint16)( messageToSend.size() - sizeof( quint16 ) );QTcpSocket *clientConnection = m_tcpServer->nextPendingConnection();connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));clientConnection->write(messageToSend);clientConnection->disconnectFromHost();
}
Wenn eine neue Verbindung beim Server eintrifft, wird das SignalnewConnection() gesendet. Der Server reagiert darauf mit einemeigenen Slot sendMessage() und sendet die Nachricht uber den Socket,der zur jeweiligen Verbindung gehort.
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 31
![Page 32: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/32.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Inhalt
1 Einleitung
2 QtNetwork
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 32
![Page 33: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/33.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Motivation
Um Objekte oder Nachrichten uber Netzwerkschnittstellen zu senden,werden i.d.R. verschiedene (Sprach)Konzepte genutzt.
JSon
XML
YAML
Plaintext
Serialisierung
Wir werden in dieser Einheit XML Nachrichten senden.
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 33
![Page 34: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/34.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Motivation
Um Objekte oder Nachrichten uber Netzwerkschnittstellen zu senden,werden i.d.R. verschiedene (Sprach)Konzepte genutzt.
JSon
XML
YAML
Plaintext
Serialisierung
Wir werden in dieser Einheit XML Nachrichten senden.
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 33
![Page 35: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/35.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Aufbau einer XML-Nachricht
<?xml version="1.0"?><ChatServerRequest timestamp="2015-03-07T09:40:45" clientId="usjhg23" service="startChat">
<Parameters><Param>SebastianH</Param>
</Parameters></ChatServerRequest>
Einfache Nachricht zur Kommunikation mit einem Server.
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 34
![Page 36: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/36.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
XML Nachrichten parsen
Um eine XML Nachricht in (ein) Objekt(e) zu parsen (umzuwandeln),existiert die Klasse QXmlStreamReader. Das vorhergehende Beispielkonnte so eingelesen werden:
// (const QString & xmlInput, QString & service, QString & clientId, QDateTime & timestamp, std::vector<QString> & params)
QXmlStreamReader reader(xmlInput);reader.readNextStartElement();
if (reader.name() == "ChatServerRequest"){
QXmlStreamAttributes & attributes = reader.attributes(); // Attributeservice = attributes.value("service").toString();clientId = attributes.value("clientId").toString();QString timeString = attributes.value("timestamp").toString();timestamp = QDateTime::fromString(attributes.value("timestamp").toString(), Qt::ISODate);
reader.readNextStartElement(); // parameter
while (reader.readNextStartElement() && reader.name() == "Param") //Param{QString param = reader.readElementText();params.push_back(param);
}}
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 35
![Page 37: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/37.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
XML Nachrichten parsen
Naturlich konnen solche Nachrichten auch im Code erzeugt werden. Hierzuexistiert, analog zu QXmlStreamReader, die KlasseQXmlStreamWriter. Hier ein Beispiel, um die vorherige Nachricht zuerzeugen:
// (QString * pXmlOutput, const QString service, QString data, const std::vector<QString> & params,QString clientId)
QXmlStreamWriter writer(pXmlOutput);writer.setAutoFormatting(true);writer.writeStartDocument(); // <?xml version="1.0"?>
writer.writeStartElement("ChatServerRequest");
writer.writeAttribute("timestamp", QDateTime::currentDateTime().toString(Qt::ISODate));writer.writeAttribute("clientId", clientId);writer.writeAttribute("service", service);
writer.writeStartElement("Parameters");for (size_t i = 0; i < params.size(); i++){
const QString & param = params[i];writer.writeTextElement("Param", param);
}writer.writeEndElement(); // </Parameters>writer.writeEndElement(); // </ChatServerReuqest>writer.writeEndDocument(); // Schliesse Dokument ab
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 36
![Page 38: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/38.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Inhalt
1 Einleitung
2 QtNetwork
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 37
![Page 39: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/39.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Aufgabe
Schreiben Sie eine Client-Applikation, die sich zu einem Server verbindenund diesem Nachrichten senden kann. Der Server wird den kompletten Tagauf dem Dozenten-Notebook unter der IP 134.147.194.159:9911laufen. Sie konnen mit dem Server uber XML-Nachrichten, die uber eineTCP-Verbindung gesendet werden, kommunizieren. Eine API daruberfinden Sie im Anschluss. Der Server sendet bei jeder Verbindung eineQUuid als eindeutige ID. Bitte speichern Sie aber nur die, die Sie nachder Registrierung auf dem Server erhalten. Diese dient zureindeutigen Zuordnung Ihrer Nachrichten. Alle anderen clientIDskonnen Sie verwerfen.Punkte
Anmeldung an Server: 25 Punkte
Erfolgreiches Versenden von Nachrichten an den Server: 50 Punkte
Abmeldung vom Server: 25 Punkte
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 38
![Page 40: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/40.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
XML - Server Verbindung herstellen
Wenn Sie sich mit dem Server uber connectToHost des QTcpSocketverbinden, antwortet der Server mit folgender Nachricht:
<?xml version="1.0"?><ChatServerConnected timestamp="2015-03-07T09:40:45" clientId="usjhg23"></ChatServerConnected>
Die clientId sollten Sie fur Ihre weitere Interaktion mit dem Serverspeichern.Folgende Services bietet der Server:
startChat - Anmeldung beim Server, muss immer zuerst gemachtwerden
sendMessage - Senden einer Nachricht, funktioniert nur wennvorher 1x startChat aufgerufen wurde
closeChat - Abmeldung vom Server
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 39
![Page 41: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/41.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
startChat
Um dem Server mitzuteilen, dass Sie sich registrieren wollen, benutzen Sieden Service startChat. Das Attribut timestamp sollte die aktuelle Zeit(QDateTime) und clientId die vom Server zugewiesene ClientIdenthalten. Das erste Parameter-Tag sollte Ihren Benutzernamen enthalten.
<?xml version="1.0"?><ChatServerRequest timestamp="2014-08-07T11:40:45" clientId="usjhg23" service="startChat"><Parameters><Param>MarcT</Param></Parameters></ChatServerRequest>
Der Server antwortet dann mit folgender Nachricht:<?xml version="1.0"?><ChatServerRequestAnswer timestamp="2014-08-07T11:40:45" clientId="usjhg23" success="1"><message>User registered</message></ChatServerRequestAnswer>
Dies ist die Nachricht, die Sie bei erfolgreicher Verbindung erhalten. Istdiese nicht erfolgreich verlaufen (success=0), wird Ihnen der Fehlerinnerhalb des message-Tags angezeigt (Username already taken, Useralready registered).
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 40
![Page 42: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/42.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
sendMessage
Um dem Server mitzuteilen, dass Sie eine Nachricht schicken wollen,benutzen Sie den Service sendMessage. Das Attribut timestamp solltedie aktuelle Zeit (QDateTime) und clientId die vom Serverzugewiesene ClientId enthalten. Das erste Parameter-Tag sollte IhrenBenutzernamen enthalten. Das zweite die zu sendende Nachricht.
<?xml version="1.0"?><ChatServerRequest timestamp="2014-08-07T11:40:45" clientId="usjhg23" service="sendMessage"><Parameters><Param>MarcT</Param><Param>Die ist ein Test!</Param></Parameters></ChatServerRequest>
Der Server antwortet dann mit folgender Nachricht:<?xml version="1.0"?><ChatServerMessageAnswer timestamp="2014-08-07T11:40:45" clientId="usjhg23" success="1"><message>Message send</message></ChatServerMessageAnswer>
Dies ist die Nachricht, die Sie bei erfolgreicher Aktion erhalten. Ist diesenicht erfolgreich verlaufen (success=0), wird Ihnen der Fehler innerhalbdes message-Tags angezeigt (User not registered, Wrong Username).
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 41
![Page 43: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag](https://reader036.vdokument.com/reader036/viewer/2022062922/5f06d61e7e708231d419fad6/html5/thumbnails/43.jpg)
Einleitung QtNetwork Exkurs: QtXML Aufgabe
closeChat
Um dem Server mitzuteilen, dass Sie sich abmelden wollen, benutzen Sieden Service closeChat. Das Attribut timestamp sollte die aktuelle Zeit(QDateTime) und clientId die vom Server zugewiesene ClientIdenthalten. Diese Anweisung ist parameterlos.
<?xml version="1.0"?><ChatServerRequest timestamp="2014-08-07T11:40:45" clientId="usjhg23" service="closeChat"><Parameters/></ChatServerRequest>
Der Server antwortet dann mit folgender Nachricht:<?xml version="1.0"?><ChatServerClosedAnswer timestamp="2014-08-07T11:40:45" clientId="usjhg23" success="1"><message>Chat closed</message></ChatServerClosedAnswer>
Dies ist die Nachricht, die Sie bei erfolgreicher Aktion erhalten. Ist diesenicht erfolgreich verlaufen (success=0), wird Ihnen der Fehler innerhalbdes message-Tags angezeigt (User not registered).
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 42