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='Unknown' then
Data.BoardName:=BoardNameWMIC;
if Data.BoardManufacturer='Unknown' then
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