![]() |
TIdTCPServer: erkennen ob String oder Stream?
Ich habe zwei Anwendungen auf verschiedenen Plattformen (Windows und iOS), die Daten an den selben IdTCPServer-Socket übermitteln sollen. Dabei sendet die Windows-Anwendung die verschlüsselten Daten in Form eines einfachen Strings
Delphi-Quellcode:
TCPClient.IOHandler.WriteLn(ClientDataString, IndyTextEncoding_UTF8);
während die iOS-App die verschlüsselten Daten in einer TMemoryStream-ähnlichen Stream übermittelt, was in etwa dem
Delphi-Quellcode:
TCPClient.IOHandler.Write(ClientDataStream, 0, true);
entsprechen würde. Kann ich in OnExecute von TIdTCPServer irgendwie sicherstellen, ob es sich bei den ankommenden Daten um ein String oder eine Stream handelt? |
AW: TIdTCPServer: erkennen ob String oder Stream?
Daten sind Daten. Wenn du unterschiedliche Daten unterscheiden können willst, musst du selber dafür sorgen.
Z.B. dadurch dass jeder erst mal ein Byte vor dem eigentlichen Inhalt schickt, dass festlegt (bzw. erkennen lässt) ob der Inhalt ein Stream oder ein String ist. |
AW: TIdTCPServer: erkennen ob String oder Stream?
Die Client-Anwendungen können aktuell leider nicht angepasst werden, ich muss es irgendwie schaffen, den Typ der Daten serverseitig zu erkennen.
|
AW: TIdTCPServer: erkennen ob String oder Stream?
Dann musst du raten.
Aber da kommt es dann stark drauf an was genau in den Strings bzw. Streams enthalten ist. Falls in den Streams immer JPEG-Dateien wären, könntest du nach der JPEG-Signatur schauen, falls die Strings immer mit "ABC" anfangen kannst du das testen. Falls die Streams und die Strings deutlich unterschiedliche Größen haben, kannst du versuchen es daran festzumachen. All das hängt aber wie gesagt sehr stark davon ab was/wie viel inhaltlich in den Strings/Streams steht. Eine andere Möglichkeit gibt es nicht. |
AW: TIdTCPServer: erkennen ob String oder Stream?
Zitat:
Der IOHandler hat dazu eine Readn-Methode mit einem frei definierbaren Terminator. |
AW: TIdTCPServer: erkennen ob String oder Stream?
Zitat:
Das halte ich für keine gute Idee. |
AW: TIdTCPServer: erkennen ob String oder Stream?
Zitat:
TCPClient.IOHandler.WriteLn(StringDerCRLFEnthält, IndyTextEncoding_UTF8); kann der Server nicht erkennen, nach welchem CRLF Schluss ist. Das könnte so auch jetzt schon nicht funktionieren. Es gibt keine Möglichkeit, den "Typ" abzufragen, der im Socket ankommt. Man kommt nur mit Kenntniss des Protokolls weiter. Wenn die Daten z.B. eine konstante Länge haben, ist es einfach. Es wäre gut zu sehen, wie bisher die Daten von iOS serverseitig eingelesen wurden. |
AW: TIdTCPServer: erkennen ob String oder Stream?
Zitat:
|
AW: TIdTCPServer: erkennen ob String oder Stream?
Zitat:
=> wenn das Dateiformat bekannt ist, ist das Einlesen einfach. (Besser wäre natürlich, die Länge vorher zu senden, so wie IOHandler.Write() das optional kann. Im konkreten Fall ist das leider nicht gegeben - gesucht wird daher ein Workaround, der mit beiden Clients funktioniert) |
AW: TIdTCPServer: erkennen ob String oder Stream?
Zitat:
Bei einer Kommunikation (über TCP) muss man Messages mit definierten Strukturen definieren an die sich beide Seiten halten müssen. Alles andere kann quasi nur in die Hose gehen. Falls die Client-Anwendungen wie uuups sagte tatsächlich nicht angepasst werden können (sicher? wirklich? Ist das zu 100% unmöglich? Falls nicht sollte das auf jeden Fall gemacht werden, auch wenn das vllt. etwas Arbeit ist) kann man sich nur irgendwas zurechtwurschteln und beten, dass nichts schief geht. Zitat:
Unterm Strich gibt es keine (richtige) Lösung, wenn er die Clientanwendungen nicht anpassen kann/will. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 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