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