AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Alive vom Server aus. Server "Client noch da" Client "j
Thema durchsuchen
Ansicht
Themen-Optionen

Alive vom Server aus. Server "Client noch da" Client "j

Ein Thema von Jackie1983 · begonnen am 4. Jul 2008 · letzter Beitrag vom 4. Jul 2008
Antwort Antwort
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

Alive vom Server aus. Server "Client noch da" Clie

  Alt 4. Jul 2008, 09:35
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ärenoch 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?
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#2

Re: Alive vom Server aus. Server "Client noch da"

  Alt 4. Jul 2008, 10:10
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
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#3

Re: Alive vom Server aus. Server "Client noch da"

  Alt 4. Jul 2008, 10:14
callbacks habe ich schon was von gehört,
habe aber keine Ahnung wie ich das umsetze.

Wenn mir also jemand weiter helfen kann......
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#4

Re: Alive vom Server aus. Server "Client noch da"

  Alt 4. Jul 2008, 10:20
Wie gesagt, ob und wie das über Sockets möglich ist, weiss ich nicht. Ich verwende dafür DCOM/COM+ Interfaces.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#5

Re: Alive vom Server aus. Server "Client noch da"

  Alt 4. Jul 2008, 11:47
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:
TClientDataBla =record
  lastMessageReceived: integer;
  pingSent: integer;
end;
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).
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;
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#6

Re: Alive vom Server aus. Server "Client noch da"

  Alt 4. Jul 2008, 12:02
habe es jetzt auf eine ganz billige weise gelöst.
Delphi-Quellcode:
try
  sendeDatenAnSocket(bla);
except
  showmessage('client offline');
end;
denke das es keine saubere art ist!?
Muss mal schauen @yankee seine idee ist nicht schlecht.....
  Mit Zitat antworten Zitat
Antwort Antwort


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:40 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