Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy TCP Client Server - Verständnisfragen und Empfehlungen (https://www.delphipraxis.net/183612-indy-tcp-client-server-verstaendnisfragen-und-empfehlungen.html)

361 22. Jan 2015 19:39

Indy TCP Client Server - Verständnisfragen und Empfehlungen
 
Hallo zusammen,

ich muss eine Kommunikation zwischen mehreren Clients zu einem Server über TCP/IP realisieren. Die Clients sind verteilt im Internet erreichbar. Die Clients müssen Daten vom Server abfragen. Spontan fielen mir hierzu die Indy TCP Client / Server Komponenten ein. IDE ist Delphi XE, Indy 10.5.7, Umsetzung soll damit erfolgen, Client-Anzahl ca. 100. Leider finde ich nirgendwo einen gültigen Download für die Indy TCP Client/Server Demos, daher hier ein paar Beispiele und Fragen. Ich habe bereits für Client und Server jeweils eine Demo-Anwendung implementiert. Die Kommunikation über Strings funktioniert bereits.

Beispiele:
- es sollen Statusabfragen an den Server erfolgen
- es sollen neue Daten abgefragt und in eine DB importiert werden
- die Clients versuchen, sich zyklisch zu verbinden
- es sollte eine gewisse Verschlüsselung der Daten erfolgen

Fragen:
- sind die Indy-Komponenten hierzu empfehlenswert bzw. gibt es bessere Alternativen für Delphi?
- wenn ich mehrere parallele Client-Verbindungen habe, wie kann ich als Server unterscheiden, mit wem ich aktuell kommuniziere? ich habe ja nur das "IdTCPServerExecute"-Event, wo alles von allen Clients aufläuft: muss ich hier mit Threads arbeiten und wenn ja wie?
- wie bekomme ich die IP des Clients heraus? "AContext.Connection.Socket.Binding.PeerIP" ist immer leer, obwohl ich über Mobilfunk mittels Tethering eine Verbindung von meiner Client-Demo zu meiner Server-Demo aufgebaut habe, ich brauche die öffentliche IP des Clients
- welchen Container (Dateien oder Protokoll) sollte ich bestenfalls zur Übertragung der Daten nutzen? es geht mir hier vor allen Dingen um die Datenkonsistenz. Kann ich sicher gehen, dass Daten auch komplett übertragen wurden wenn es keine Exception gibt? Oder muss ich damit rechnen, dass Daten verändert/unvollständig übertragen werden ohne, dass eine Exception auftritt? Stichwort: Fehlerkorrektur. Wie kriege ich als Server heraus, dass ich alle Daten erhalten habe?
- ist eine Verschlüsselung der Daten möglich und worauf muss man hier achten?

Vielleicht noch zur Info: Mir schwebte bisher recht laienhaft vor, Daten mittels IStringList in einen gepackten Stream zum Server zu übertragen. Ich freue mich daher über Eure Erklärungen, Vorschläge und Tipps. Vielen Dank und Gruß Sebastian :wink:

stahli 23. Jan 2015 13:35

AW: Indy TCP Client Server - Verständnisfragen und Empfehlungen
 
Ich habe mich damit auch mal länger befasst und hier mal meine Threads (incl. einiger Tests) zusammengesammelt:

http://www.delphipraxis.net/180134-i...ptimieren.html
http://www.delphipraxis.net/179457-i...verwendet.html
http://www.delphipraxis.net/171226-i...o-clients.html
http://www.delphipraxis.net/170904-i...bertragen.html
http://www.delphipraxis.net/179722-2...indy-10-a.html

Mein Projekt funktioniert für meine Anforderungen sehr gut. Ich bin aber kein TCP-Experte. ;-)

Vielleicht ein paar grundsätzliche Dinge:

Der Client fragt beim Server an und wartet auf Antwort. Es wird also eine Verbindung aufgebaut und aufrecht erhalten bis sie wieder geschlossen wird.
Die Anfrage kann z.B. so aussehen:

Zitat:

Ich bin Client xyz.
Sag mir mal den Kontostand.
Die Antwort lautet dann
Zitat:

20.000

Ich wüsste jetzt nicht, dass der Server die IP des Client erkennt, aber notfals kannst Du sie im Rahmen des Protokolls übergeben.

Streams übergeben ist kein Problem. Ich wandle sogar StringLists in Streams, damit Sonderzeichen korrekt übertragen werden.

Vielleicht hilft das ja schon mal für den Anfang und Du kannst ja dann genauer fragen.

mjustin 24. Jan 2015 07:10

AW: Indy TCP Client Server - Verständnisfragen und Empfehlungen
 
Als Protokoll würde ich HTTPS verweden - damit sind die meisten Punkte der Wunschliste abhakbar.

Nur falls die Kommunikation auch bidirektional (d.h. der Server sendet Nachrichten auch ohne vorhergehenden Request des Client) sein sollte, wären andere Protokolle (Websockets, Telnet, Stomp) passender als HTTPS.

Bei HTTP(S) sind beliebige Nachrichteninhalte (binär oder Text, z.B. JSON, XML) übertragbar.

Indy enthält mit TIdHttpServer und TIdHttp eine umfassende server- und clientseitige Implementierung, die mit hundert Verbindungen problemlos umgehe kann.

Mavarik 24. Jan 2015 10:51

AW: Indy TCP Client Server - Verständnisfragen und Empfehlungen
 
Zitat:

Zitat von 361 (Beitrag 1287505)
Fragen:
- sind die Indy-Komponenten hierzu empfehlenswert bzw. gibt es bessere Alternativen für Delphi?

Für diese Anzahl würde ICS von Overbyte nutzen!

Mavarik

bernhard_LA 24. Jan 2015 19:53

AW: Indy TCP Client Server - Verständnisfragen und Empfehlungen
 
hier noch ein Link zu Demos "INDY10/XE2"

http://sourceforge.net/projects/indy10clieservr/

361 27. Jan 2015 17:50

AW: Indy TCP Client Server - Verständnisfragen und Empfehlungen
 
Hallo,

und zunächst mal vielen Dank für Eure Antworten.

Die Kommunikation soll bidirektional sein. Ich habe bereits viel gelesen, insbesondere hier im Forum.

@Mavarik: Was ist der Vorteil von ICS zu Indy? Kannst Du da ein paar Dinge nennen?

Ich habe ansonsten noch meine konkrete Frage, zu der ich bisher nirgends die Antwort finden konnte: Wenn ich mehrere parallele Client-Verbindungen zum TCP Server habe, wie kann ich als TCP Server unterscheiden, mit wem ich aktuell kommuniziere? Ich habe das "IdTCPServerExecute"-Event in welchem ich die Daten empfange. Ich möchte und muss unterscheiden, was mir Client 1 und 2 und... geschickt hat. Wie stelle ich das am besten an? Deshalb auch die Frage, wie ich die Source-IP heraus bekomme. Ich schaue mir noch mal die Links von Stahli an, vielleicht finde ich dort noch etwas und freue mich ansonsten auf Eure Antworten, die ich nun auch zeitnah beantworten kann :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 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