TCP Datenübertragung, welches Format?

port29

deus.Server
Hallo Leute,

ich habe gerade folgendes Problem: Ich möchte Daten über TCP von einem Server zu einem Client übertragen. Aber ich frage mich nun, wie ich das am einfachsten und effizientesten anstelle. Die Anwendung wird verschiedene Daten liefern, z.B. nur einfache Events (z.B. Berechnung abgeschlossen) oder z.B die Daten eines Punktes, einer Linie, eines Rechtecks.

Ich sehe nun zwei Möglichkeiten dafür:

a) Es wird einfach nur ein String übertragen, der alle Daten hintereinander enthällt, die z.B. mit $ getrennt sind. Bsp.:

object$point;1;2$line;2;3;4;5

Der String wird dann anhand von $ gesplittet und mit dem ersten Part des Arrays wird ein switch/case Vergleich durchgeführt. Und der andere Rest wird an der entsprechenden Stelle weiterverarbeitet

b) Es wird ein String im XML Format übertragen

<xml>
<action>object</action>
<object name="line" coords="1,2,3,4" />
...
</xml>

Und am Ende wird das ganze mit einem Parser eingelesen


Für welche Variante würdet ihr euch entscheiden? Der "Flaschenhals" der Verbindung wird ein 100MBit Netzwerk sein, idR. läuft aber alles über 10GBit. Es kann aber eine nahezu unbegrenzte Anzahl an Objekten existieren.
 
Hi

Ich würde sagen, es kommt darauf an, wie hoch das Datenaufkommen ist, also wie oft du die Daten sendest. Das Serialisieren und Deserialisieren von Xml ist jedenfalls schneller als das Itterieren über ein String-Array.
Selbiges gilt auch für deinen "Flaschenhals" (wobei ich bei diesen kleinen Datenvolumen eine 100 MBit Leitung nicht unbedingt als Flaschenhals sehe).

Prinzipiell jedoch würde ich die Xml-Variante vorziehen. Wenn du dein Schema intelligent gestaltest und damit versuchst das Datenvolumen gering zu halten, solltest du keine Problem damit haben
 
Das mit den Strings hab ich früher auch so gemacht, inzwischen bin ich aber darauf umgestiegen, Daten, die ich im Netz verschicke als Bytes zu codieren, hat man einfach bessere Kontrolle drüber. Wenn in einem deiner Strings auf einmal dein Trennungszeichen auftaucht, bist du am allerwertesten, deshalb würde ich die Methode mit den Strings nicht empfehlen. Wenn du das als bytes verschickst, dann kannst du ne Art Header schreiben, in dem z.B. drin steht, was für Daten dein Paket enthält und wieviele Datensätze es enthält. Oder wenn du einen Event überträgst dann definierst du einfach deinen Header als ein Byte, dass dir sagt, dass ein Event übertragen wird und im zweiten byte kannst du dann mitteilen, um welche Art von Event es sich handelt und wenn dir das nicht genug ist, dann kannst du meinetwegen noch einen string mitschicken, in der Form, dass du ein Byte (oder vier, wäre dann ein int) verwendest, um zu sagen, wie lang dein String ist und dann hängst du eben soviele bytes an, wie dein String lang ist. Beim empfangen kannst du dann einfach auslesen wie lang der string ist und dann eben soviele bytes lesen, unabhängig davon, welche Zeichen in deinem String vorkommen.
 

Neue Beiträge

Zurück