Hi,
erstmal würde ich im Servercode die überprüfung der Userdaten ins OnConnect Event verschieben
und im OnExecute nur Deine "wirklichen" Kommandos verarbeiten.
Bei fehlerhaften Logindaten kann man auch ruhig mal die Connection dicht machen
Dein Hauptproblem ist aber Du anscheinend annimmst komplett mit Events im Client arbeiten zu können.
Es gibt aber kein OnData oder ähnliches.
Indy arbeitet mit "Blocking Sockets", die sauberste und eleganteste Lösung ist die komplette Kommunikation des Clients
in einen Thread auszulagern, damit erschlägst Du dann auch gleich ein paar andere Probleme(Einfrieren der Anwendung etc.).
Ich vermute das bei Dir das Event und ClientConnect Event gar nicht oder nicht dann eintritt, wenn Du es erwartest.
Du solltest so vorgehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var sTmp : String;
begin
Benutzername := Username.Text;
Client.Connect(5000);
if not Client.connected then
begin
ShowMessage('Konnte keine Verbindung herstellen');
exit;
end;
// ShowMessage('Verbindung hergestellt');
Client.Socket.Write('Login' + '|' + Form1.Username.Text + '|' + Form1.Passwort.Text);
// spätestens ab hier sollte jetzt alles in einen Thread ausgelagert werden
While Client.connected do
begin
sTmp := Client.Socket.Readln; // Read-Timeout vorher setzen oder über Parameter
if sTmp <> '' then
begin
// mache irgentwas mit der Servernachricht
end;
end;
end;
So der grobe Ablauf, ohne Garantie(habs eben ohne
IDE getippt).
Aber Auslesen der Serverdaten sollte definitiv innerhalb eines Threads ablaufen,
Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.