![]() |
Indy TCP Server/Client: Streams senden/empfangen und Unterschied zu Strings???
Hallo!
Frohe Ostern und schöne Feiertage! Ein Server (der selber ein Webservice-Client ist) empfängt pro Minute mehrere Hundert einzelne String-Datensätze, die er dann an alle verbundenen Clients weiterleitet. Die Übertragung geschieht mittels TIdTCPServer/TIdTCPClient. Bis jetzt habe ich die Daten auch als Strings an die Clients geschickt. Auf der Clientseite wird jeder empfangene Datensatz in einen XML-Reader geladen. Der XML-Reader benutzt dafür eine Funktion namens LoadFromXML, die nichts anderes macht, als die Daten in ein Stream zu laden, um dann mittels LoadFromStream an den Reader zu übergeben. Jetzt überlege ich mir, ob es nicht besser wäre, die Datensätze direkt als Streams zu übertragen. Dazu hätte ich einige Fragen an die erfahrenen Experten: 1. Ist die Datenübertragung mittels Streams grundsätzlich schneller oder langsammer als die mit Strings? Macht es überhaupt Sinn, auf Streams umzubauen? 2. Wie schon erwähnt, müssen permanent mehrere Hundert einzelne Datensätze pro Minute hintereinander übertragen werden. Ist die Übertragung mittels Streams überhaupt dafür geeignet? 3. Im Fall von Strings muss ich jeden zu übertragenen String mit einer eindeutigen Zeichenkombination beenden, damit der Client die "zusammengewachsene" Datenpakete auseinander halten kann. Muss ich irgendwas in der Art auch für Streams anwenden? 4. In Foren wird es viel diskutiert über die Übertragung von Daten in Records (auch mittels Streams). Welche Vorteile könnten Records in meinem Fall haben? Im Voraus vielen Dank! |
AW: Indy TCP Server/Client: Streams senden/empfangen und Unterschied zu Strings???
Zitat:
Zunächst einmal ist TCP streambasiert, d.h. man muss sich das so vorstellen wie eine Röhre aus der immer wieder Kugeln (Bytes) herausfallen. (es gibt noch eine 2. Röhre in Gegenrichtung) Wieviele Kugeln direkt nacheinander rausfallen lässt sich nicht vorhersehen, denn das hängt von vielen Faktoren des Netzwerks und des IP-Stacks ab. Daher ist es unbedingt notwendig einzelne Nachrichten mit irgendeinem Verfahren zu trennen. Gebräuchlich sind Verfahren die einzelne Nachrichten durch ein eindeutiges Zeichen (meist Carriage Return) trennen oder vor jeder Nachricht die Anzahl der folgenden Bytes übermitteln. Ob man Nachrichten als Strings versendet oder eine TStream-Klasse einsetzt ist nicht so wichtig. Wichtig ist dass man ein gutes Protokoll definiert und dass der Empfänger damit umgehen kann nur Bruchstücke einer Nachricht zu empfangen und daraus die ursprünglichen Nachrichten wieder herstellen kann. |
AW: Indy TCP Server/Client: Streams senden/empfangen und Unterschied zu Strings???
Zitat:
![]() In diesem Fall ist es vorteilhafter einen Stream zu senden: zum einen spart es Bandbreite, und es entfällt die Base64 Konvertierung auf Server und Client. Zitat:
Zitat:
Zitat:
|
AW: Indy TCP Server/Client: Streams senden/empfangen und Unterschied zu Strings???
[OT oder nicht, dürfte etwas mit dem Thema zu tun haben]
Ich hab kürzlich irgendwo aufgeschnappt, dass man mit Strings evtentuelle Probleme mit Endianness ganz umgeht - stimmt das eig. so? Bei der ANSI (und sonstigen 1 Byte/Zeichen) Kodierung ist mir klar, dass die Daten immer in einer einzigen Reihenfolge im Speicher liegen, weil die Anordnungsmöglichkeit bei 1 Byte eben nur 1 ist. Gilt es aber auch für andere Kodierungen, die mehr benötigen? Wenn man z.B. 2 oder 4 Byte / Zeichen benötigt, können die ja, je nach Endianness, anders im Speicher liegen - oder werden Strings speziell gehandhabt? Weil das wäre dann oder auch immer (wenn nur 1 Byte/Zeichen) ein Pluspunkt für ein String-basiertes Protokoll! Klärt micht auf! :P [/OT] @mjustin Man muss ja nicht wirklich base64 kodieren, oder? Ich kanns mir nur dann vorstellen, wenn man Kollisionen mit Terminalzeichen & Daten vermeiden will. Das kann man aber auch anders und viel eleganter lösen, indem man die Terminalzeichen, die so im Datensatz vorkommen, einfach escaped. |
AW: Indy TCP Server/Client: Streams senden/empfangen und Unterschied zu Strings???
Zitat:
Zitat:
![]() Zitat:
Zum richtigen Thema, habe ich das richtig verstanden:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz