PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Sockets und XML


ethrandil
2003-12-09, 23:17:06
Olà ihr Spezis ;-)

Ich bin grade dabei einen kleinen PtP-Chat unter Java zu programmieren.

Dabei soll das Protokoll aus XMl bestehen.

Nun möchte ich ja über einen bestehenden Socket nacheinander mehrere Messages in besagtem XML-Format senden.
Wie bekomme ich nun das 'Document' für DOM?
builder.parse( mySocket.getInputStream() ) würde doch versuchen aus dem Socket zu lesen bis dieser geschlossen wird, oder?

Wie bekomme ich es denn am schönsten hin, dass nur der Abschnitt vom ersten Tag, (Top-Level) bis zu dessen Beendigung geparst wird?

Eth

grakaman
2003-12-10, 10:41:48
Original geschrieben von ethrandil
Olà ihr Spezis ;-)

Ich bin grade dabei einen kleinen PtP-Chat unter Java zu programmieren.

Dabei soll das Protokoll aus XMl bestehen.

Nun möchte ich ja über einen bestehenden Socket nacheinander mehrere Messages in besagtem XML-Format senden.
Wie bekomme ich nun das 'Document' für DOM?
builder.parse( mySocket.getInputStream() ) würde doch versuchen aus dem Socket zu lesen bis dieser geschlossen wird, oder?

Wie bekomme ich es denn am schönsten hin, dass nur der Abschnitt vom ersten Tag, (Top-Level) bis zu dessen Beendigung geparst wird?

Eth

Du kannst nicht davon ausgehen, dass ein Stream auch alle Daten enthält, die du benötigst. Die können auch fragmentiert ankommen. In 90% kann das zwar funktionieren, aber es wird auch irgend einmal nicht funktionieren. Du musst deswegen den Stream so lange lesen, bis irgend ein Delimiter kommt. Allerdings müsste es doch bei Java auch irgendwelche Message Formatter geben, die die Objekte automatisch serialisieren bzw. auf Clientseite deserialisieren (z.B. Soap oder binär). Ich bin mir auch niht sicher, ob du wirklich eine P2P Anwendung hast, denn so wie ich es rausgelesen habe, empfängt/sendet ja der Server bei dir alle Messages.

MfG

ethrandil
2003-12-10, 12:47:29
Jeder Client hat einen 'server', der an jeden 'server' der verbundenen clients die Nachricht schickt :)

Sicher gäbe es auch SOAP, aber SOAP ist mir zu fett ...

Gibt es da keine schlankere Methode?

Außerdem ist doch per tcp/ip gesichert, dass alle Pakete in der richtigen Reihenfolge ankommen. Damit könte ich doch aus dem Stream lesen, bis mein root-tag geschlossen wird, oder?

[btw: der normale InputStream wird natürlich noch von einem Reader gekapselt]

Eth

grakaman
2003-12-10, 13:23:53
Original geschrieben von ethrandil
Jeder Client hat einen 'server', der an jeden 'server' der verbundenen clients die Nachricht schickt :)


Ja das stimmt. Ich habe das falsch verstanden.


Sicher gäbe es auch SOAP, aber SOAP ist mir zu fett ...

Gibt es da keine schlankere Methode?


Soap ist XML (was du ja eigentlich wolltest). Für einen Chat ist das nun in keinster Weise zu Fett. Problematisch würde es meiner Meinung nach erst werden, wenn du große Tabellen von Datenbankabfragen serialisierst. Aber bei einem Chat kannst du getrost zu Soap greifen.


Außerdem ist doch per tcp/ip gesichert, dass alle Pakete in der richtigen Reihenfolge ankommen. Damit könte ich doch aus dem Stream lesen, bis mein root-tag geschlossen wird, oder?


Genau. Mit fragmentiert meinte ich ja auch stückchenweise und du weißt nicht was in dem Stückchen ankommt. Deswegen musst du nach einem Delimiter suchen. Und! den Stream kannst du demzufolge nur korrekt beenden, wenn du den Delimiter hast. Es gibt zwar immer solche Methoden wie ReadBlock, ReadLine etc., aber du weißt nicht, ob die wirklich alle Daten enthalten. Bsp. Message:

Hallo Hans
Mir gehts heute schlecht.

Wenn ich jetzt z.B. mit ReadLine oder RedBlock oder ReatToEnd oder sonst was arbeite (keine Ahnung wie das in Java heisst), kann ich mich nicht darauf verlassen, dass der auch z.B. im Falle von ReadLine nach Hans aufhört, geschweige denn überhaupt Hans hat. Oder bei ReadToEnd alles gelesen hat.
Das ist halt ein Stream und funktioniert im Prinzip wie eine Queue.

MfG

Trap
2003-12-10, 13:30:23
www.xmlrpc.com

Ist eine einfache/abgespeckte Variante von SOAP.

ethrandil
2003-12-10, 13:33:40
Aber benötige ich um SOAP zu verwenden nicht ein 'richtiges' Framework? [ich habe da nur im Zusammenhang mit Webservices was von gehört] Kann man das auch 'mal eben' in seine Anwendung einbauen?

Wo finde ich die entsprechenden Jars möglichst mit Docs...? (<-- faul) [außer vielleicht http://ws.apache.org/soap/ ;D]

Und dann habe ich noch eine grundsätzliche Frage:

Ich hatte vor den Socket offen zu lassen, bis der Client disconnectet. Ist das schlecht? Sollte ich für jede neue Message erneut am ServerSocket andocken?

Ansonsten: Danke!

Eth :)

EDIT: Und wie geht soap ohne einen Applicationserver ???

Xmas
2003-12-10, 17:34:05
Mag jetzt albern klingen, aber: Warum XML?

grakaman
2003-12-10, 18:06:50
Original geschrieben von Xmas
Mag jetzt albern klingen, aber: Warum XML?

Damit es durch Firewalls geht, weil ja üblich der HTTP Port offen ist. Natürlich nur, wenn es durch Firewalls gehen soll.

MfG

ethrandil
2003-12-10, 22:31:34
Original geschrieben von Xmas
Mag jetzt albern klingen, aber: Warum XML?
Weil das ganze zum erlernen von XML dient, und das nicht (nur) für mich.
Ich wollte mal meinem 'Schüler' zeigen, wie schön ein Protokoll aussehen kann ...

Aber wenns zu viel Aufwand ist, dann lass ichs halt weg und nehm das ekligste was es gibt: ObjectOutputStream ...