Einzelnen Beitrag anzeigen

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