Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

Indy 10 - Adresse wird bereits verwendet

  Alt 8. Mär 2014, 23:06
Ich habe einen Indy-Server und Client.
Derzeit tausche ich nur Now und einen Counter als Strings aus.
Zusätzlich wird Now und ein Counter in jedem Client (lokal) verwaltet und in Strings gespeichert.

Zwei Probleme und eine Frage...

1) Wenn zwei Clients auf dem selben Rechner laufen gibt es nach einiger Zeit immer wieder die Fehlermeldung "Adresse wird bereits verwendet"

- Ist in meinem Code direkt etwas falsch?

2) Wenn der Server auf meinem PC und der Client auf meinem Notebook läuft hängt die Client-GUI aller paar Sekunden für ca. 2 Sekunden.
Das betrifft alle laufenden Clients synchron. Es sollte also m.E. wohl am Netzwerk liegen.
Andersrum gibt es keine Hänger, auch nicht wenn der Server und Client auf dem Laptop laufen.

- Vielleicht liegst an der Firewall? Oder liegen dafür andere Gründe nahe?

3) Wenn ich sagen wir mal 100 mögliche Commands hätte, müssten diese 100 Fälle im Server ja hintereinander geprüft werden.
Die 100 Commands nacheinander im Client-Timer zu senden, wäre aber sicher suboptimal.
Wie macht man es korrekt? Alle Commends in einer Liste verwalten und im Timer jeweils einen Schritt weiter iterieren und 1 Command senden?


Delphi-Quellcode:
// Server

procedure TForm1Server.FormCreate(Sender: TObject);
var
  Binding: TIdSocketHandle;
begin
  IdIPWatch1.Active := True;
  Memo1.Text := IdIPWatch1.LocalIP;
  Binding := IdTCPServer1.Bindings.Add;
  Binding.IP := IdIPWatch1.LocalIP;
  Binding.Port := 40000;
  IdTCPServer1.Active := True;
  IdIPWatch1.Active := False;
  Button1Click(Sender);
end;

procedure TForm1Server.IdTCPServer1Execute(AContext: TIdContext);
var
  cmd: String;
begin
  try
    Inc(Counter);
    cmd := Trim(AContext.Connection.IOHandler.ReadLn);

    if (cmd = '@Now') then
    begin
      AContext.Connection.IOHandler.WriteLn(DateTimeToStr(Now));
    end;

    if (cmd = '@Counter') then
    begin
      AContext.Connection.IOHandler.WriteLn(IntToStr(Counter));
    end;

  finally
    AContext.Connection.Disconnect;
  end;
end;

// Client

procedure TForm1Client.Timer1Timer(Sender: TObject);
begin
  Gui.sGuiNow := DateTimeToStr(Now);
  Inc(Gui.GuiCounter);
  Gui.sGuiCounter := IntToStr(Gui.GuiCounter);

  IdTCPClient1.Connect;
  try
    IdTCPClient1.IOHandler.WriteLn('@Now');
    Gui.sNow := IdTCPClient1.IOHandler.ReadLn();
  finally
    IdTCPClient1.Disconnect;
  end;

  IdTCPClient1.Connect;
  try
    IdTCPClient1.IOHandler.WriteLn('@Counter');
    Gui.sCounter := IdTCPClient1.IOHandler.ReadLn();
  finally
    IdTCPClient1.Disconnect;
  end;

  ...
end;
Miniaturansicht angehängter Grafiken
indyfehler.png  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat