Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Server/ClientSocket - Stabile Verbinung für mehrere Stunden? (https://www.delphipraxis.net/32824-server-clientsocket-stabile-verbinung-fuer-mehrere-stunden.html)

romber 28. Okt 2004 11:57


Server/ClientSocket - Stabile Verbinung für mehrere Stunden?
 
Hallo!

Auf dem Server-Rechner läuft eine TServerSocket-Anwendung. Diese schickt ab und zu Daten an alle verbundeten Clients. In der StatusBar des Server-Programms bekomme ich immer Anzahl der verbundeten Clients. Es kann so passieren, dass ich die Server-Programm ab und zu neustarten muss, weil diese praktisch noch in Entwicklung ist. Dabei warten die Clients auf den Server und sobald der Online ist, wird wieder verbunden. Beim Testen mit mehreren Clients ist mir aufgefallen, dass nicht alle gestarteten Clients wieder verbunden werden, wenn der Server neu gestartet ist.

Ich mache es so: jeder Client hat einen Timer, der jede 5 Sekunden überpfüft, ob die Verbindung zum Server besteht. Wenn nicht, wird versucht, diese herzustellen.

Code:
if not ClientSocket.Socket.connected then
try
ClientSocket.Open
except end;
Ich habe eigentlich nicht viel Ahnung von Sockets. Hat jemand vielleicht ein Paar übersichtliche Code-Beispiele für mich, die mir weiterhelfen konnten? Ich würde gerne eine Stabile Verbindung zwischen dem Server und Client aufbauen, die mehrere Stunden erhalten wird, auch wenn keine Daten gesendet werden. Und der Client soll auf den Server warten, wenn dieser mal offline ist.

Danke!

MfG,
Ralf

romber 28. Okt 2004 17:26

Re: Server/ClientSocket - Stabile Verbinung für mehrere Stun
 
Kann mir niemand helfen? :(

alcaeus 28. Okt 2004 17:45

Re: Server/ClientSocket - Stabile Verbinung für mehrere Stun
 
Hi romber,

erstens solltest du erst nach 24 Stunden pushen :zwinker:

Zweitens könntest du ja ein Serversocket ins Clientprogramm bauen, und sobald der Server nach einem Neustart wieder online geht, geht er eine zuvor gespeicherte Liste von IPs durch, verbindet sich zu jeder, sendet ein Signal und trennt die Verbindung dann wieder. Anschließend kann sich der Client wie gehabt verbinden.
Eine andere Möglichkeit ist es über UDP zu lösen, da dort der "Server" einen Broadcast an alle Clients senden kann, welche bei Erhalt der Broadcastnachricht sich wieder verbinden.

Greetz
alcaeus

Muetze1 28. Okt 2004 22:11

Re: Server/ClientSocket - Stabile Verbinung für mehrere Stun
 
Moin!

Zum anderen löst Open meist keine Exception aus, da Open nur einen Befehl an den Thread weiter gibt, der dann parallel zu deinem Open Aufruf später eine Exception schmeissen wird. Daher: nutze den OnError CallBack...

MfG
Muetze1

romber 29. Okt 2004 09:47

Re: Server/ClientSocket - Stabile Verbinung für mehrere Stun
 
Erstmal Vielen Dank für eure Antworten! :lol:

Zitat:

Zitat von Muetze1
Daher: nutze den OnError CallBack...

@Muetze1: Das mit "OnError CallBack" habe ich nicht ganz verstanden. Köntest du bitte etwas mehr erklähren? Danke!

Muetze1 29. Okt 2004 10:23

Re: Server/ClientSocket - Stabile Verbinung für mehrere Stun
 
Moin!

Wenn die durch die Open Methode veranlasste Verbindung zum Server fehl schlägt, dann musst du schon sehr viel Glück und Rechenzeit haben, dass diese Exception noch bei Ausführung der Open Methode auftritt. Im Normalfall tritt die Exception zeitlich später auf, also wenn der Hauptprogrammablauf schon an deinem Try / Except Konstrukt vorbei ist. Daher solltest du das OnError Ereignis der Komponente benutzen, um Verbindungsfehler zu erkennen bzw. zu unterdrücken. In dem OnError Ereignis kannst du die Ausgabe der Fehlermeldung mit dem auf 0 setzen der ErrorCode Variable verhindern (die dir übergeben wird) und auch z.B. den Timer wieder anstellen, damit dieser wieder 5 Sekunden wartet. Wenn kein Fehler auftritt, dann wird dir das OnConnect / OnAccept Ereignis darüber berichten...

Du solltest den Timer bis zu einem definiertem Ergebnis (OnError, OnAccept/OnConnect) der Verbindungsaufnahme aus lassen, weil du die Sockets durcheinander bringst bei einer reentranten Nutzung. Ausserdem kannst du nie wissen wie lange der Verbindungsaufbau dauert - manchmal kann es auch schonmal dauern einen Namen aufzulösen...

MfG
Muetze1


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