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;