![]() |
Alive vom Server aus. Server "Client noch da" Clie
moin,
bei meiner Client/Server Anwendung klappt alles soweit wunderbar. (Sockets kein Indy) Die Clients melden sich an bzw. ab vom Server. Nur eins weis ich noch nicht wirklich wie ich das umsetzten soll. Was passiert wenn ein Client abstürzt oder die Internetverbindung vom Client getrennt wird? Dann bekommt der Server das nicht mit. Mein erster Versuch wäre:(noch nicht umgesetzt) In einem Timer (10s) sende ich an alle Clients ein "noch da" und speicher den Client in einer liste ab. Wenn Client noch Online sendet der ein "jo" zurück. In der Server Routine zum auslesen der Daten. Wenn ein "jo" vom Client kommt wird dieser aus der liste gelöscht, also noch online. Wenn der Timer wieder gestartet wird, kann geprüft werden ob der client noch in der liste steht, wenn ja ist er nicht mehr online. Was meint ihr dazu? Oder gibt es vielleicht eine bessere Lösung? |
Re: Alive vom Server aus. Server "Client noch da"
Ich weiss nicht, ob und wenn wie es über Sockets möglich ist, aber ich verwende für soetwas Callbacks.
- Server enthält Liste mit Clients - von den Clients sind Callbacks auf dem Server bekannt - Server ruft Callback für jeden Client auf - wenn Callback mit einem Timeout fehlschlägt, wird der Client aus der Liste der aktiven Clients gelöscht |
Re: Alive vom Server aus. Server "Client noch da"
callbacks habe ich schon was von gehört,
habe aber keine Ahnung wie ich das umsetze. Wenn mir also jemand weiter helfen kann...... |
Re: Alive vom Server aus. Server "Client noch da"
Wie gesagt, ob und wie das über Sockets möglich ist, weiss ich nicht. Ich verwende dafür DCOM/COM+ Interfaces.
|
Re: Alive vom Server aus. Server "Client noch da"
Mit dem "noch da" ist eine nicht ganz unübliche Methode. Gibt's zum Beispiel auch im IRC (da heisst es PING und PONG).
Um dir das Leben allerdings etwas leichter zu machen, würde ich wie folgt vorgehen: Der Server speichert sich zu jedem Client ab:
Delphi-Quellcode:
pingSent initialisierst du am Anfang mit 0 oder -1. Jedes mal, wenn vom Client Daten reinkommen, egal, was es ist, sezt du lastMessageReceived auf die aktuelle Zeit (auf die aktuelle Uhrzeit, die aktuelle Programmlaufzeit oder... Du darfst dir was aussuchen, was sich gut eignet).
TClientDataBla =record
lastMessageReceived: integer; pingSent: integer; end; Dann kannst du mit einem Timer (oder mit einem EventThread oder so) ständig prüfen, wie lange es her ist, dass von dem Client eine Nachricht kam. Ist dies länger als X Sekunden her, dann sendest du den ping-request an den Client und speicherst in pingSent wieder die Zeit ab, bei der du den Request gesendet hast. Wenn vom Client ein pong kommt, musst du den pingSent natürlich wieder auf den Startwert setzen, der markiert, dass momentan kein ping-request unterwegs ist. Sollte dein Timer an einem Client angekommen sein, dessen pingSent > 0 ist und wo pingSent länger als Y Sekunden her ist, dann gehst du davon aus, dass die Verbindung draufgegangen ist. So in etwa sähe dann die Funktion deines Timers aus:
Delphi-Quellcode:
var clientDatas: array of TClientDataBla;
const TIMEOUT =5; const MAX_REQUEST_TIME_AGE =20; begin for i:=0 to length(clientDatas) -1 do begin if clientDatas[i].pingSent > 0 then begin if zeitdifferenz(clientDatas[i].pingSent, now()) > TIMEOUT then verbindungPlattmachen(i); end else begin if zeitdifferenz(clientDatas[i].lastMessageReceived, now()) > MAX_REQUEST_TIME_AGE then sendePingRequest(i); end; end; end; |
Re: Alive vom Server aus. Server "Client noch da"
habe es jetzt auf eine ganz billige weise gelöst.
Delphi-Quellcode:
denke das es keine saubere art ist!?
try
sendeDatenAnSocket(bla); except showmessage('client offline'); end; Muss mal schauen @yankee seine idee ist nicht schlecht..... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 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