AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Client / Server automatischer aufbau vom Client
Thema durchsuchen
Ansicht
Themen-Optionen

Client / Server automatischer aufbau vom Client

Ein Thema von Thomas83 · begonnen am 17. Okt 2008 · letzter Beitrag vom 20. Okt 2008
Antwort Antwort
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#1

Client / Server automatischer aufbau vom Client

  Alt 17. Okt 2008, 13:41
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
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#2

Re: Client / Server automatischer aufbau vom Client

  Alt 20. Okt 2008, 08:59
hat keiner eine idee?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: Client / Server automatischer aufbau vom Client

  Alt 20. Okt 2008, 09:23
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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#4

Re: Client / Server automatischer aufbau vom Client

  Alt 20. Okt 2008, 09:39
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 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
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

Re: Client / Server automatischer aufbau vom Client

  Alt 20. Okt 2008, 10:02
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?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#6

Re: Client / Server automatischer aufbau vom Client

  Alt 20. Okt 2008, 10:28
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....
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#7

Re: Client / Server automatischer aufbau vom Client

  Alt 20. Okt 2008, 10:46
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?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

Re: Client / Server automatischer aufbau vom Client

  Alt 20. Okt 2008, 10:50
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?!
[/edit]
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#9

Re: Client / Server automatischer aufbau vom Client

  Alt 20. Okt 2008, 10:53
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 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.
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#10

Re: Client / Server automatischer aufbau vom Client

  Alt 20. Okt 2008, 10:55
Zitat von s.h.a.r.k:
[edit]nur so aus interesse: du darfst wirklich eine verbindung aus dem unternehmensnetzwer nach außen machen?!
[/edit]
Ja und nein, zum test schon.
  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 20:03 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