sebastian houben institut fur neuroinformatik¨ ...€¦ · einleitungqtnetworkexkurs: qtxmlaufgabe...
TRANSCRIPT
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
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Inhalt
1 Einleitung
2 QtNetwork
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 2
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
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
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
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Netzwerkprogrammierung
Server - Client Peer to Peer
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 6
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
Netzwerkprogrammierung
Server - Client Peer to Peer
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 7
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
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
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
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
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
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
Einleitung QtNetwork Exkurs: QtXML AufgabeMotivation Exkurs: Protokolle
TCP-Verbindungsauf- und -abbau
TCP-Handshake TCP-Teardown
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 14
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Inhalt
1 Einleitung
2 QtNetwork
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 32
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
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
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
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
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
Einleitung QtNetwork Exkurs: QtXML Aufgabe
Inhalt
1 Einleitung
2 QtNetwork
3 Exkurs: QtXML
4 Aufgabe
C++ Anwendungskurs 19.Marz 2018 — Sebastian Houben 37
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
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
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
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
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