Einzelnen Beitrag anzeigen

Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Indy TCP Client-Server Problem

  Alt 14. Jul 2009, 09:36
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.
  Mit Zitat antworten Zitat