QXmlStreamReader und QXmlStreamWriter
Verfasst: 5. April 2008 15:18
Hi!
Ich versuch mich grad an einer Client-Server Anwendung, wo ich auf der einen Seite mit QXmlStreamWriter ueber Socket raussschreibe und auf der anderen Seite mit QXmlStreamReader wieder einlese. Die "XML"-Nachrichten haben z.B. die Form
Mir ist klar, dass das kein valides XML ist, aber der Einfachheit halber und um diesen ganzen XML-Overhead zu vermeiden, wuerde ich das ganz gern so machen. Jetz hab ich von XML keinen Plan, was hoechstvermutlich das eigentliche Problem ist.
Wenn ich jetzt ueber telnet obengenannten String zweimal kurz hintereinander mit Enter getrennt an den Server schicke, dann hat der QXmlStreamReader kein Problem mit den Nachrichten.
Wenn ich sie allerdings in der Form, also ohne irgend ein Trennzeichen (und so werden sie auch momentan vom Client geschickt) verschluckt sich der Server bei der zweiten Nachricht und meldet ein
Die Frage dabei waere, was muesste ich eventuell am Ende des Strings einbauen, damit mehrere Nachrichten hintereinander fuer den QXmlStreamReader als korrekt interpretiert werden, oder muesste ich die Strings irgendwie anders verpacken? Oder ist das so ueberhaupt nicht moeglich (Alternativen?)?
Der Part, wo die Nachricht im Server geparsed wird, sieht so aus:
Dankeschoen!
Ich versuch mich grad an einer Client-Server Anwendung, wo ich auf der einen Seite mit QXmlStreamWriter ueber Socket raussschreibe und auf der anderen Seite mit QXmlStreamReader wieder einlese. Die "XML"-Nachrichten haben z.B. die Form
Code: Alles auswählen
<Login name="login" pass="pass"></Login>Wenn ich jetzt ueber telnet obengenannten String zweimal kurz hintereinander mit Enter getrennt an den Server schicke, dann hat der QXmlStreamReader kein Problem mit den Nachrichten.
Wenn ich sie allerdings in der Form
Code: Alles auswählen
<Login name="login" pass="pass"></Login><Login name="login" pass="pass"></Login>Code: Alles auswählen
"Extra content at end of document."Der Part, wo die Nachricht im Server geparsed wird, sieht so aus:
Code: Alles auswählen
qDebug() << "Incoming Message from " << getPeer();
QXmlStreamReader reader;
reader.setDevice(m_tcpSocket);
QString element;
QXmlStreamAttributes attributes;
while (!reader.atEnd() && !reader.hasError())
{
reader.readNext();
if (reader.tokenType() == QXmlStreamReader::StartElement)
{
element = reader.name().toString();
attributes = reader.attributes();
}
if (reader.tokenType() == QXmlStreamReader::EndElement)
{
bool incoming = true;
Message *msg = new Message(element, attributes, m_tcpSocket, incoming);
MessageQueue::getInstance()->addMessage(msg);
}
}
if (reader.hasError())
{
//processIncoming();
qDebug() << "Processing message from " << getPeer() << " failed: "
<< reader.errorString();
return;
}