AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TIdTCPServer: erkennen ob String oder Stream?
Thema durchsuchen
Ansicht
Themen-Optionen

TIdTCPServer: erkennen ob String oder Stream?

Ein Thema von uups · begonnen am 6. Mär 2019 · letzter Beitrag vom 6. Mär 2019
Antwort Antwort
Seite 1 von 2  1 2      
uups

Registriert seit: 23. Aug 2004
68 Beiträge
 
#1

TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 15:52
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

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

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?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 15:55
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
uups

Registriert seit: 23. Aug 2004
68 Beiträge
 
#3

AW: TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 16:17
Die Client-Anwendungen können aktuell leider nicht angepasst werden, ich muss es irgendwie schaffen, den Typ der Daten serverseitig zu erkennen.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 16:27
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

AW: TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 17:20
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

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

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?
Für den Server ist erst einmal alles, was aus dem Socket kommt, ein "Stream". Wenn der von iOS gesendete DataStream aber so wie der von Windows mit einem eindeutigen ZeilenEnde-Terminator endet, kann man auf der Serverseite mit Indy genau bis zu diesem Terminator lesen, z.B. Linefeed. Damit wäre der Windows-Terminator (CR/LF) ebenfalls abgedeckt, man müsste denn nur noch das CR abschneiden.

Der IOHandler hat dazu eine Readn-Methode mit einem frei definierbaren Terminator.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 17:23
Für den Server ist erst einmal alles, was aus dem Socket kommt, ein "Stream". Wenn der von iOS gesendete DataStream aber so wie der von Windows mit einem eindeutigen ZeilenEnde-Terminator endet, kann man auf der Serverseite mit Indy genau bis zu diesem Terminator lesen, z.B. Linefeed. Damit wäre der Windows-Terminator (CR/LF) ebenfalls abgedeckt, man müsste denn nur noch das CR abschneiden.

Der IOHandler hat dazu eine Readn-Methode mit einem frei definierbaren Terminator.
Und wenn in dem Stream CR/LF Bytes vorkommen?
Das halte ich für keine gute Idee.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

AW: TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 17:54
Für den Server ist erst einmal alles, was aus dem Socket kommt, ein "Stream". Wenn der von iOS gesendete DataStream aber so wie der von Windows mit einem eindeutigen ZeilenEnde-Terminator endet, kann man auf der Serverseite mit Indy genau bis zu diesem Terminator lesen, z.B. Linefeed. Damit wäre der Windows-Terminator (CR/LF) ebenfalls abgedeckt, man müsste denn nur noch das CR abschneiden.

Der IOHandler hat dazu eine Readn-Methode mit einem frei definierbaren Terminator.
Und wenn in dem Stream CR/LF Bytes vorkommen?
Das halte ich für keine gute Idee.
Wenn CR/LF in den Daten vorkommen können, hat man in beiden Fällen ein Problem, das Ende zu erkennen:

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.
Michael Justin

Geändert von mjustin ( 6. Mär 2019 um 18:01 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#8

AW: TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 17:54
Für den Server ist erst einmal alles, was aus dem Socket kommt, ein "Stream". Wenn der von iOS gesendete DataStream aber so wie der von Windows mit einem eindeutigen ZeilenEnde-Terminator endet, kann man auf der Serverseite mit Indy genau bis zu diesem Terminator lesen, z.B. Linefeed. Damit wäre der Windows-Terminator (CR/LF) ebenfalls abgedeckt, man müsste denn nur noch das CR abschneiden.

Der IOHandler hat dazu eine Readn-Methode mit einem frei definierbaren Terminator.
Und wenn in dem Stream CR/LF Bytes vorkommen?
Das halte ich für keine gute Idee.
Richtig. PNG-Dateien z.B. enthalten per Definition immer Absätze.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#9

AW: TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 17:56
Richtig. PNG-Dateien z.B. enthalten per Definition immer Absätze.
Der Server sammelt dann die Absätze ein bis der letzte eintrifft.

=> 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)
Michael Justin

Geändert von mjustin ( 6. Mär 2019 um 18:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: TIdTCPServer: erkennen ob String oder Stream?

  Alt 6. Mär 2019, 18:01
Wenn CR/LF in den Daten vorkommen können, hat man in beiden Fällen ein Problem, das Ende zu erkennen
CR/LF sind ja nichts stringspezifisches. Das sind Bytes mit den Werten 13 und 10. Die können potenziell in jeder Datei vorkommen.
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.

Der Server sammelt dann die Absätze ein bis der letzte eintrifft.

=> wenn das Dateiformat bekannt ist, ist das Einlesen einfach.
Das ist genauso rumgepfusche wie alles andere auch.
Unterm Strich gibt es keine (richtige) Lösung, wenn er die Clientanwendungen nicht anpassen kann/will.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 6. Mär 2019 um 18:04 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz