... oder wie man klein Darky ganz langsam in den Wahnsin treibt ... egal.
Um dem normalen Informatik Unterricht zu entkommen nehme ich dieses Jahr wieder an der Software Challenge teil, das dies immer ganz lustig ist und eine Menge Pluspunkte beim Lehrer einbringt.
Dabei gibt es einen Spielserver und die armen Schüler müssen einen Client schreiben, der diese Spiel spielen kann. Zur Übertragung wird ein XML ähnliches Protokoll verwendet, dass zwar nicht ganz dem Standart entspricht, allerdings mit den Parsern kompatibel ist.
Nun kam folgendes Problem zu Stande:
Ich nutze Qt als Framework um einerseits vorgefertigte Teile zu haben, andererseits auch, da der Client auf Windows / Linux parallel entwickelt wird und es so einfach einfacher ist.
Grundidee: Ein QTcpSocket dient als Verbindung zum Spielserver. Daraus wird nun direkt durch einen QXmlStreamReader der Xml Code interpretiert.
Der Spielserver ist jedoch etwas zickig, er bricht Spaßeshalber so mitten im Protokoll ab um dann weiter zu senden, was jedoch leider den Effekt hat, dass man so nicht direkt lesen kann.
So werden nun also die Daten ausgelesen und dem Parser zugeführt.
void SimpleAI::readMessage() {
#ifdef _VERBOSE
// debug output
std::cout << "-> SimpleAI::readMessage() begin" << std::endl;
#endif
// warten bis ein neuer Datensatz ankommt
this->interface->waitForReadyRead(5000);
// Zwischenspeicher für die Daten
QByteArray buffer;
do {
buffer += this->interface->readAll();
} while(this->interface->waitForReadyRead(100));
// Daten werden an den Parser übergeben
this->addData(buffer);
#ifdef _VERBOSE
// debug output
std::cout << "-> SimpleAI::readMessage() end" << std::endl;
#endif
}
Alles anzeigen
Dies funktioniert in sofern auch, als dass die Daten ankommen und ordentlich zusammengesetzt sind. Beim interpretieren bricht er mit folgender Fehlermeldung ab.
ZitatExpected charakter data.
Wenn man allerdings die spaßige Idee hat, obiges QByteArray über cout auszugeben, die Ausgabe kopiert und in eine Datei einfügt, kann der Parser die ohne Probleme lösen. Schreibt man sie jedoch direkt aus dem QByteArray in eine Datei, kann er diese nicht lesen.
Irgendwer irgendwelche Vorschläge wie man dies nun lösen kann, ich komm da grad einfach nicht weiter.