![]() |
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:
Wenn ihr mehr infos oder sourcen braucht einfach sagen was....
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; thx |
Re: Client / Server automatischer aufbau vom Client
hat keiner eine idee?
|
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 ;) |
Re: Client / Server automatischer aufbau vom Client
Zitat:
Zitat:
![]() mfg |
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:
|
Re: Client / Server automatischer aufbau vom Client
Zitat:
Ja, danke das hilft mir schon was weiter.... |
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? |
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] |
Re: Client / Server automatischer aufbau vom Client
Zitat:
Zitat:
|
Re: Client / Server automatischer aufbau vom Client
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 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