sebastian houben institut fur neuroinformatik¨ ...€¦ · einleitungqtnetworkexkurs: qtxmlaufgabe...

43
C++ Anwendungskurs 19.M ¨ arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag 5: Netzwerkprogrammierung Sebastian Houben Institut f ¨ ur Neuroinformatik www.ini.rub.de/research/groups/rtcv/ 19.M ¨ arz 2018

Upload: others

Post on 14-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Sebastian Houben Institut fur Neuroinformatik¨ ...€¦ · EinleitungQtNetworkExkurs: QtXMLAufgabe C++ Anwendungskurs 19.M¨arz 2018 — Sebastian Houben 1 C++ Anwendungskurs Tag

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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