Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#9

Re: XML-String über TCP empfangen

  Alt 11. Mai 2007, 10:10
Du brauchst keine Größenangabe, da du durch die XML Struktur immer feststellen kann, wann diese wieder vollständig (geschlossen ist). Dein grundlegendes Problem ist einfach nur, dass du mehrfach aufgerufen wirst, bis alle Daten empfangen wurden (bzw. du mehrfach Datan abholen musst). Dabei können die Daten an beliebiger Stelle getrennt werden. Von daher folgende Vorgehensweise:

1. Ein Buffer anlegen - am besten dynamisch. Es eignet sich z.B. ein TMemoryStream.
2. Alle abgeholten Datenpackete in diesen Stream schreiben (immer hinten dran)
3. Wenn du mal wieder was in den MemoryStream geschrieben hast, dann kannst du die Daten verarbeiten. Dazu musst du wissen, ob die Daten vollständig sind - und das kann dir dein XML Provider sagen. Der weiss genau, ob die XML Struktur vollständig ist (sprich: gibt es zum Hauptknoten-Tag auch ein schliessendes Tag). Wenn dies der Fall ist, weiss er auch wo die Daten eines XML Packetes aufhören. Damit kannst du diesen Teil vorne aus dem MemoryStream entfernen. Dieses so lange wiederholen bis der MemoryStream eine Grösse von 0 hat (Idealfall, alles interpretierbar, da alles vollständig) oder der XML Provider sagt, dass ist noch nicht vollständig.

So sollte der grundlegende Weg sein. Nun ist offen wie du deinen XML Provider entlocken kannst, wie gross die Daten sind und bis wo in dem Stream eine komplette, gültige Struktur geht und ob sie gültig (komplett) ist.

Die String selber parsen um das Ende zu ermitteln (ob es enthalten ist) wäre ein möglicher Schnellschluss. Wenn der Hauptknoten immer gleich heisst, dann kannst du fest nach dem Ende-Tag des Knotens im String suchen, selber aufteilen und aus dem Stream löschen und entsprechend auch einen schon fertig aufbereiteten Stream deinem XML Provider geben.
  Mit Zitat antworten Zitat