Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Client / Server automatischer aufbau vom Client (https://www.delphipraxis.net/122526-client-server-automatischer-aufbau-vom-client.html)

Thomas83 17. Okt 2008 13:41


Client / Server automatischer aufbau vom Client
 
servus,

nach wie vor sitze ich an meiner Client / Server Anwendung.
Es kommen immer wieder neue Probleme :(
Der Client und der Server ist eine Threadklasse.

Problem 1
Der Client läuft auf meinem Notebook und der Server auf meinem anderen Computer.
Wenn ich das Netzwerkkabel am Notebook ziehe, bekommt der Server das nicht mit also auch kein OnError.

Läuft der Server je doch auf dem Notebook und ich ziehe das Kabel, wird das OnError ausgelöst und die Clientliste wird aktualisiert.

Problem 2
Der Server läuft, der Client verbindet sich. Anzeige beim Server "Clients Online 1". Ziehe ich das Kabel und stecke es nach x sekunde wieder ein, verbindet sich der Client wieder. Entweder habe ich dann stehen "Clients Online 2" oder auch mal "Clients Online 5" obwohl nur ein client sich anmeldet....das heist der "alte" wird nicht gelöscht.... aber warum 5, habe ich active zu oft aufgerufen?

Hier ein paar codeschnipsel
Delphi-Quellcode:
procedure TThreadServer.OnClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: ErrorEvent; var ErrorCode: Integer);
begin
  Socket.Close;
  ErrorCode := 0;
  Synchronize(SyncServerInfo);
end;

procedure TThreadServer.Execute;
var
  MSG : TMsg;
begin
  inherited;
 
  while (  GetMessage(msg, 0, 0, 0) ) do
    DispatchMessage(msg);
end;


 
procedure TThreadClient.OnClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: ErrorEvent; var ErrorCode: Integer);
begin
  socket.Close;
  ErrorCode := 0;
end;

procedure TThreadClient.OnTimer(Sender: TObject);
var
  i : integer;
begin
  if fClient.Active then
  begin
    //Jobs die zum Server gesendet werden
    if fJobOutList.Count-1 > -1 then
    begin
      //Erst mit einem Ping testen ob Verbindung besteht.
      fPingPong.SendePing;
      //...
      //Ist Pong angekommen?
      if fPingPong.Pong then
      begin
        //Daten senden
      end else begin
        fClient.Socket.Close;
        fClient.Active := false;
      end;
    end;
  end;
  //Noch Online?
  if not fClient.Active then begin
    Synchronize(SetClientOnline); //<- wieder verbinden also nur "fClient.Active := true"
    while not fClient.Active do
    begin
      sleep(100);
      inc(i);
      if i=20 then break;
    end;
    if not fClient.Active then fClient.Active := false;
  end;
end;
Wenn ihr mehr infos oder sourcen braucht einfach sagen was....
thx

Thomas83 20. Okt 2008 08:59

Re: Client / Server automatischer aufbau vom Client
 
hat keiner eine idee?

s.h.a.r.k 20. Okt 2008 09:23

Re: Client / Server automatischer aufbau vom Client
 
hey,

zu deinem ersten problem: wie wäre es, wenn du die clients pollst?! d.h. du schickst jede x sekunden eine nachricht zu diesen, um anhand einer ankommenden nachricht zu prüfen, welche clients noch "da" sind und welche eben nicht mehr. such mal im forum. dort wurde dieses problem -- unter anderem auch in einigen meiner threads -- des öfteren diskutiert.

zu deinem zweiten problem kann ich dir nichts sagen, da ich mit den indys arbeite...

ps: ich war grad etwas schockiert als ich gelesen habe, dass du ein OnTimer-event nutzt? hast du einen timer innerhalb der threads?! oO ich weiß nicht, ob das absicht ist, aber warum lässt du das ganze nicht über den thread laufen???

mit freundlichen grüßen
ich ;)

Thomas83 20. Okt 2008 09:39

Re: Client / Server automatischer aufbau vom Client
 
Zitat:

Zitat von s.h.a.r.k
hey,

zu deinem ersten problem: wie wäre es, wenn du die clients pollst?! d.h. du schickst jede x sekunden eine nachricht zu diesen, um anhand einer ankommenden nachricht zu prüfen, welche clients noch "da" sind und welche eben nicht mehr. such mal im forum. dort wurde dieses problem -- unter anderem auch in einigen meiner threads -- des öfteren diskutiert.

das heist ich soll sie nur noch beim Connect am Server anlegen. Alle x sekunden eine ping senden und wenn ein pong zurück kommt ok, wenn nicht löschen. Oder?

Zitat:

Zitat von s.h.a.r.k
ps: ich war grad etwas schockiert als ich gelesen habe, dass du ein OnTimer-event nutzt? hast du einen timer innerhalb der threads?! oO ich weiß nicht, ob das absicht ist, aber warum lässt du das ganze nicht über den thread laufen???

Das hatte ich auch zu erst so. Nur wenn ich im Client im Thread die Verbindung aufbauen wollte funktionierte das nicht. Dann habe ich hier im Forum nachgefragt, mir wurde vorgeschlagen das mit einem Timer zumachen und die Nachrichtenschleife im "Threadmain"..

mfg

s.h.a.r.k 20. Okt 2008 10:02

Re: Client / Server automatischer aufbau vom Client
 
das mit dem pollen wurde mir hier so beigebracht ;) denn es gibt imho keine (mir bekannte) andere möglichkeit zu testen, ob die verbindung vom server zum client noch aktiv ist oder eben nicht. ich habe das eben immer so gemacht:
  • anlegen einer TList als container für client-objekte
  • beim connecten eines clients: eigenes client-objekt erzeugt mit verschiedenen daten zum client, wie ip, port, logon-time etc. (für interne verwaltung und statistiken, ein nice-to-have)
  • alle x sekunden (im unternehmensnetzwerk kannst ja jede 1-5 sekunden pingen) und prüfen, ob eine antwort zurückkommt. entsprechend wird die client-liste angepasst und nicht vorhandene clients entfernt.
ich denke damit kannst gut was anfangen, oder?

Thomas83 20. Okt 2008 10:28

Re: Client / Server automatischer aufbau vom Client
 
Zitat:

Zitat von s.h.a.r.k
  • alle x sekunden (im unternehmensnetzwerk kannst ja jede 1-5 sekunden pingen) und prüfen, ob eine antwort zurückkommt. entsprechend wird die client-liste angepasst und nicht vorhandene clients entfernt.
ich denke damit kannst gut was anfangen, oder?

nicht alle Clients befinden sich im unternehmensnetzwerk. Es gibt auch 3-4 Clients die sich extern verbinden, da kann ich ja nicht einfach pingen, denke das muss ich es über die ping pong methode machen.....

Ja, danke das hilft mir schon was weiter....

Thomas83 20. Okt 2008 10:46

Re: Client / Server automatischer aufbau vom Client
 
wollte bei externen clients alle 5 sekunden ein ping abschicken, was meint ihr?
Sind die 5 sekunden ok oder eher 2 oder doch 10 sekunden?

s.h.a.r.k 20. Okt 2008 10:50

Re: Client / Server automatischer aufbau vom Client
 
wieso kannst du die nicht pingen?! btw: mit pingen meine ich: schicke eine nachricht, wie "PING" (also den string), und warte auf eine antwort, wie "PING_OK". den code dafür musst du eben selbst machen.

definier mal die leitung zu den externen clients? wlan? dsl? modem? isdn? etc ;)

[edit]
btw: wenn ich so recht überlege, dann kannst du, selbst wenn die externen clients mit dsl verbunden sind, den gleichen zeitabstand nehmen, wie die im unternehmensnetzwerk, da das ja nicht so viel zeit kostet. selbst spiele laufen ja bei dsl2000 (teilweise) flüssig und diese haben einen wesentlich höheren traffic.

nur so aus interesse: du darfst wirklich eine verbindung aus dem unternehmensnetzwer nach außen machen?! :shock:
[/edit]

Thomas83 20. Okt 2008 10:53

Re: Client / Server automatischer aufbau vom Client
 
Zitat:

Zitat von s.h.a.r.k
wieso kannst du die nicht pingen?! btw: mit pingen meine ich: schicke eine nachricht, wie "PING" (also den string), und warte auf eine antwort, wie "PING_OK". den code dafür musst du eben selbst machen.

ok falsch verstanden, dachte du meintest mit ping halt "ping ip" ne ok für ping pong habe ich mir schon eine klasse geschrieben....

Zitat:

Zitat von s.h.a.r.k
definier mal die leitung zu den externen clients? wlan? dsl? modem? isdn? etc ;)

Das weis ich leider nicht, isdn und modem denke ich nicht. Wird schon ne DSL leitung sein, 1000 aufwärts.

Thomas83 20. Okt 2008 10:55

Re: Client / Server automatischer aufbau vom Client
 
Zitat:

Zitat von s.h.a.r.k
[edit]nur so aus interesse: du darfst wirklich eine verbindung aus dem unternehmensnetzwer nach außen machen?! :shock:
[/edit]

Ja und nein, zum test schon.


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