Chat in Delphi + Indy

Sebastian Wramba

Erfahrenes Mitglied
Hi zusammen,

ich hatte vor, ein einfaches User-to-User Chat-Programm über eine TCP-Verbindung zu erstellen.
Ich hab folgenden Code in mein Server-Programm gepackt:

Code:
procedure TForm1.btTestClick(Sender: TObject; AThread: TIdPeerThread);
begin
 with AThread.Connection do
 begin
   WriteLn('message');
   WriteLn('Die Nachricht');
 end;
end;

... und in den Client:

Code:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if TCPClient.Connected then
 begin
  if TCPClient.ReadLn() = 'message' then
   lstBox.Items.Add(ReadLn());
 end;
end;

Timer ist an und auf Intervall 10 gestellt.

Nun passiert aber folgendes: der Client stürzt ab, wenn der Server eine Nachricht schickt. Warum zum Henker? Oder hat vielleicht jemand eine elegantere Lösung für dieses Chat-System?

MfG Sebastian
 

Patrick Kamin

Erfahrenes Mitglied
-

Hi Sebastian,
als erstes würde ich dir empfehlen bei deiner Server-Anwendung auf jegliche Interaktion mit dem User zu verzichten. Der Server sollte ausschließlich auf Anweisungen eines Clienten reagieren und nicht selbst agieren.
Auf einen Timer würde ich verzichten, da die Indy-Komponenten doch auf eintreffende Nachrichten mit einem Ereignis reagieren können.
Was meiner Meinung nach in deiner Timer-Prozedur eine Exception wirft, ist die doppelte Puffer abfrage durch Readln().

Wenn du nun also eine Ereignis-Routine für einkommende Nachrichten schreibst, lese einmal am Anfang den Puffer per Readln() aus und speicher diesen in einer Variablen. Sämtliche Vergleiche oder String-Operationen nimmst du ausschließlich an dieser Kopie vor.