Einzelnen Beitrag anzeigen

Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#1

Dauerhafte "Onlineüberprüfung" mit Serverseitigen Befehlen

  Alt 16. Mai 2013, 11:37
Hallo,

ich habe ein Problem beziehungsweise eine generelle Frage.
Es geht um ein Server-Client System, bei dem ein Server auf Clients wartet und unter bestimmten Bedingungen Daten versendet.
Beim Systemstart des Clients versucht der Client über TCP eine Verbindung aufzubauen und versucht dies immer wieder, sofern keine Verbindung besteht.
Nach der Verbindung schickt der Client eine "Statusmeldung" an den Server und wiederholt dies immer dann, wenn sich der Status ändert. Das passiert jedoch eher selten (zumindest ohne serverseitiges Eingreifen).
Es handelt sich um ein Netzwerk von bis zu 200 Rechnern im lokalen Netzwerk und zusätzlichen Rechnern, falls Nurzer das System von zu Hause aus nutzen wollen.

Generelle Frage: Ist es bei einer doch recht hohen (bis theoretisch unbegrenzten) Anzahl an Rechnern sinnvoll, die Verbindung aufrecht zu erhalten?!

Der Server dient generell dazu, zu überprüfen, ob ein Client verfügbar ist und trägt dies in eine Datenbank ein.
Der Server erhält dann (manchmal) die Aufgabe, bestimmte Befehle an einen Client zu senden - dazu muss aber eine Verbindung bestehen, wenn der Client nicht selbst zum Server werden soll, was aufgrund der Firewall nicht geht.
Ich hatte auch schon an eine Art "Befehlswarteschlange" gedacht, bei der sich der Client alle 30 Sekunden mal verbindet und so die Möglichkeit bietet, die Befehle zu empfangen. Diese Zeitverzögerung sollte aber eigentlich auch nicht sein.

Bisher läuft das Ganze über die ursprüngliche Methode einer Dauerverbindung, doch viele Clients verlieren zwischendurch einfach die Verbindung (ohne erkennbaren Grund) und verbinden sich auch nicht erneut, wenn man den Server beispielsweise neustartet.

Kleiner Auszug aus einem Timer des Clients:
Delphi-Quellcode:
if (TCPClient.Connected) then
      begin
        if (Statusupdate) then // Wenn sich der Status geändert hat
          begin
            Data.Lockstate:=Lockstate;
            Data.Username:=GetUsername;
            Data.PCName:=GetComputerName;
            Data.CPU:=CPUName;
            Data.RAM:=IntToStr(gettotalphysmemory div (1024*1024))+' MB';
            Data.Boardname:=BoardName;
            Data.BoardManufacturer:=BoardManu;
            Data.Mac:=GetMACAdress;
            Data.Version:=Version;

            ClientMac:=Data.Mac;

            if Data.Boardname='Unknownthen
              Data.BoardName:=BoardNameWMIC;
            if Data.BoardManufacturer='Unknownthen
              Data.BoardManufacturer:=BoardManuWMIC;
            

            buf := RawToBytes(Data, SizeOf(TClientInfo));

            TCPClient.IOHandler.Write(Buf);
            Username:=User;
            LastState:=Lockstate;
          end;
        CheckCMD(); // Überprüfen, ob der Server was gesendet hat
      end
    else
      begin
        try
          TCPClient.Connect;
          Username:='';
          LastState:=4; // Nächstes Mal auf jeden Fall Status senden
        except
          Username:='';
          LastState:=4;
        end;
      end;
Gibt es da ein paar Ideen zu?

PS: Ich verwende die Indy Komponenten
  Mit Zitat antworten Zitat