Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy10 IdTCPServer und IdTCPClient (https://www.delphipraxis.net/123740-indy10-idtcpserver-und-idtcpclient.html)

ASKtec 7. Nov 2008 13:08


Indy10 IdTCPServer und IdTCPClient
 
Hallo zusammen,

ich experiementiere schon seit Tagen mit den o.g. Komponenten rum. Ich habe eine Serverapplikation und 3 verschiedene Clients.

Ein Client nimmt Daten aus einer DB und schickt diese zum Server. Dort werden diese Daten an alle verbundenen Clients verschickt und die letzten Daten für neue Clients immer zwischengespeichert.

Ein weiterer Client verbindet sich in Abständen von 5 Sekunden zum Server, sendet ein "HELO" und bekommt dann die Daten des ersten Clients...

Einen dritten Client habe als Chatclient ausgelegt, der einmal ein Connect zum Server macht und die Verbindung hält bis das Programm geschlossen wird.

Wenn ich alle Clients so programmiere, dass beim starten eine Verbindung zum Server geöffnet wird und diese erst beim beenden des Clients geschlossen wird, funktioniert alles bestens. Nur wenn aus irgendwelchen Gründen die Verbindung zum Server verloren geht, bekomme ich den Reconnect nicht mehr hin :wall:

Also dachte ich mir, ich lege die ersten beiden Clients so aus, dass diese immer nur in bestimmten Abständen zum Server connecten und dann ihre Daten senden bzw. empfangen und anschließend wieder disconnecten. Leider funktioniert das auch nicht zuverlässig.

- Beim ersten Client sollte das alle 3-4 Minuten passieren. Der erste Connect funktioniert, aber keine weiteren.
- Beim zweiten Client funktionieren im Schnitt etwa 20 Connect`s und danach ist Schluss (alle 5 Sekunden)

Nur der 3.te Client der dauerhaft verbunden ist funktioniert weiterhin. Ich muss Client 1 und 2 neu starten und dann geht das Spiel von vorne los... :pale:

Am liebsten wäre mir eine Lösung, bei der alle Clients verbunden bleiben. Wenn dann irgendwie die Verbindung zusammenbricht (z.B. Server beendet) sollte der Client weiter versuchen einen Reconnect durchzuführen.

Leider finde ich keine Lösung. Ich habe auch schon im Forum und in Nachbarforen gesucht und nichts gefunden. Viele Beispiele beziehen sich auch auf Indy9....

Kann mir jemand bitte bei dem Problem behilflich sein? Evtl. hat auch schoneinmal jemand eine Reconnect Routine für diese Komponenten umgesetzt?

Die Routine zum connecten ist wie folgt aufgebaut und wird in einem Timer aufgerufen, allerdings noch mit einer if-Abfrage gekoppelt (es wird nicht bei jedem Timer-Event connected):

Delphi-Quellcode:
    try
      with IdTCPClient1 do
        begin
          connect;
          IOHandler.WriteLn('HELO:client xy');
          sleep(200);
          IOHandler.WriteLn('INFO:' + text);
          disconnect;
        end;
     except
       // Fehler auf Form anzeigen
     end;
Ich danke Euch schon einmal im voraus...

Andreas

Angel4585 7. Nov 2008 13:23

Re: Indy10 IdTCPServer und IdTCPClient
 
Ich habe das einfach so das ich folgende Struktur habe:

Clientanwendung -> Kommunikationsmodul

Das Kommunikationsmodul ist eine eigene Klasse.
Wird die Verbindung verloren, wird das Objekt der Klasse zerstört und immer wieder versucht neu zu verbinden.
Glückt die Verbindung wird das Objekt so lange gehalten wie die Verbindung da ist.

Dadurch ist es recht einfach den Status der Verbindung anzuzeigen, da man nur schauen muss ob ein Kommunikationsobjekt vorhanden ist.

ASKtec 7. Nov 2008 16:38

Re: Indy10 IdTCPServer und IdTCPClient
 
Hallo,

danke für die schnelle Antwort. Leider bin ich noch nicht so wirklich fit was "Klassen schreiben"... Wie muss ich da genau ansetzen?

Es wäre schön wenn man das an einem Stück Quellcode nachvollziehen könnte :duck:

Wenn ich doch eine Klasse habe und das Objekt zerstöre wenn es nicht mehr funktioniert, müsste es dann nicht auch funktionieren, wenn ich das Objekt IdTCPServer1 zerstöre und neu mit "IdTCPServer1 := TIdTCPClient.Create" neu erstelle???

Gruß
Andreas

ASKtec 7. Nov 2008 21:17

Re: Indy10 IdTCPServer und IdTCPClient
 
OK, habe das Problem nun gelöst.

Scheinbar hat die Indy-Komponente ein Problem wenn man diese auf das Form zieht.

Ich habe nun die Komponente selbst erstellt. Kommt es zum Disconnect dann führe ich ein Destroy aus und erstelle die Komponente sofort wieder neu. Danach connected sie ohne Probleme....

Hier mal die entsprechende Prozedur dafür:

Delphi-Quellcode:
procedure TForm1.CheckConnection;
begin
  //Versuch etwas an den Server zu schicken
  try
    IdTCPClient1.IOHandler.WriteLn('NOOP:');
  except
    StatusBar1.Panels[0].Text := 'connection failed';
 
    //Client abschiessen und neu bauen
    IdTCPClient1.Destroy;
    IdTCPClient1 := TIdTCPClient.Create();
    // Ports und IP-Adresse des Servers holen aus ini-Datei)
    LoadSettings;

      try
        IdTCPClient1.Connect;
        IdTCPClient1.IOHandler.WriteLn('HELO:ichbins');
        StatusBar1.Panels[0].Text := 'connected';
      except
        StatusBar1.Panels[0].Text := 'last connect failed';
      end;
    end;
end;
Gruß und Danke
Andreas


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