Seite 1 von 1

QXmlStreamReader und QXmlStreamWriter

Verfasst: 5. April 2008 15:18
von keeney
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

Code: Alles auswählen

<Login name="login" pass="pass"></Login>
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

Code: Alles auswählen

<Login name="login" pass="pass"></Login><Login name="login" pass="pass"></Login>
, 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

Code: Alles auswählen

"Extra content at end of document."
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:

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;
	}
Dankeschoen!