XML auf Stream empfangen mit build()
-
Hey Leute
Wir arbeiten an nem kleinen Spiel, welches netzwerkfähig sein soll. Hierfür verwenden wir zur Kommunikation zwischen Server und Client Nachrichten , welche in XML gehalten sind.
Das Erzeugen und Schicken der XML-Nachricht funktioniert soweit gut (wie im Code unten später erklärt), doch das empfangen bereitet uns Kopfschmerzen: wir wissen nicht mehr weiter! So hofften wir hier, etwas hilfe zu erlangen!Folgendes:
Wir verwenden JDOM und darin den SAXBuilder, um die Documents zu erstellen, lesen etc.
Auf dem Client läuft ein Receiver in einem eigenen Thread, welcher die Nachricht vorerst nur annehmen und auf die Konsole ausgeben soll.Unsere run()-Methode im Thread sieht folgendermassen aus:
public void run() { while (!stopped) { try { System.out.println("[Receiver] waiting for messages..."); // Folgende Codezeile funktionert leider nicht, wir kriegen ne Exception //doc = sb.build(recvStream); // direktes lesen des Streams klappt, mit der gewünschten Ausgabe. char c; while((c = (char)recvStream.read()) != -1) { System.out.print(c); } //System.out.println(doc.getRootElement().getChildText("MessageType")); System.out.println("Dokument erzeugt"); /*} catch (JDOMException e) { System.err.println("JDOM ERROR IM RECEIVER"); e.printStackTrace();*/ } catch (IOException e) { System.err.println("[ReceiveConnection]Error while reading input stream"); e.printStackTrace(); } }
Der Aufruf von sb.build(recvStream) führt also zu einer Exception, die da heisst:
org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed.
Natürlich haben wir auch google zu Hilfe gezogen, wobei herauskam, dass keine Leerschläge am Anfang des XML-Dokumentes sein dürfen, d.h. vor dem prolog. Nun sind in unserem Dokument aber keine Leerschläge!
Auf folgende Weise wird das Dokument erstellt & versendet:
Document doc = null; doc = new Document( new Element("party") ); ... xmlOut = new XMLOutputter(); try { xmlOut.output(doc, System.out); xmlOut.output(doc, sendStream); //sendStream.flush(); //sendStream.close(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); }
Hat jemand ne Idee, an was es liegen könnte oder was wir falsch machen? Haben nun schon mehrere Stunden über dieserm Problem gebrütet und sehen den Wald vor lauter Bäumen nicht mehr!
Danke im Voraus!
mfg
rox
-
warum quält ihr euch mit xml rum? braucht ihr für euer spiel wirklich xml? muss das nicht schnell gehen? ist das nicht zuviel overhead?
Steht im xml irgenwas anderes ungültiges? lass mal das xml sehen.
-
Manchmal frage ich mich ob das eine Krankheit ist... hat den jeder Bits und Bytes vergessen?
Ich würde ebenfalls keine XML Files verschicken.XML, will doch eh nur die Geschäftsleitung...
-
hey
danke für die antworten obwohl sie ja nicht gerade lösungsorientiert waren!
also: ja, wir WOLLEN XML machen, das hat schon seinen guten grund und nein, die geschäftsleitung hat nichts dazu zu sagen.
Mittlerweilen haben wir rausgekriegt, dass es mit dem schliessen des Streams von der funktion output() ein problem gibt. doch wir werden das ganze wohl etwas anders lösen.
ausser jemand hat ne idee, wie man es schafft, ein end-of-stream zu schicken?
-1 und '\n' oder '\n\r' funktioniert alles nicht.mfg
rox
-
shutdownOutput
-
IMHO ist flush() dafür gedacht...