Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy TCPClient: Readln() Problem (https://www.delphipraxis.net/48464-indy-tcpclient-readln-problem.html)

Kill0r 25. Jun 2005 20:27


Indy TCPClient: Readln() Problem
 
Hi!
Ich hab ein Problem mit der Indy 9 Komponente IdTCPClient.
Ich kann zwar zum Server verbinden und ihm auch Nachrichten schicken, aber mit dem Empfangen gibts Probleme.
Ich hab schon in den anderen Threads geschaut aber so richtig geholfen hat keiner.
Ich lese mit einem Timmer alle 300 Millisekunden die empfangenen Daten aus also mit Readln()
Aber sobald er keine Daten mehr bekommt hängt sich das Programm auf!
Hab schon mal mit try ... except versucht ging auch nicht.
Es gibt ja kein spezielles Event dafür, dass wenn man Daten empfängt irgendwa smachen kann. Ich muss also irgednwie überprüfen, dass wenn er Daten empfängt aber auch nur dann, dass er die ausliest.
Hier mal der Code des Clienten
Delphi-Quellcode:
unit Core;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, ShockwaveFlashObjects_TLB, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, ExtCtrls, StdCtrls, IdAntiFreezeBase,
  IdAntiFreeze;

type
  TMain = class(TForm)
    flash: TShockwaveFlash;
    net: TIdTCPClient;
    timer: TTimer;
    Button1: TButton;
    size: TEdit;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure Button1Click(Sender: TObject);
    procedure netDisconnected(Sender: TObject);
    procedure netConnected(Sender: TObject);
    procedure timerTimer(Sender: TObject);
    procedure flashFSCommand(ASender: TObject; const command, args: WideString);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Main: TMain;

implementation

{$R *.dfm}

procedure TMain.FormResize(Sender: TObject);
begin
flash.Width := main.ClientWidth;
flash.Height := main.clientHeight;
end;

procedure TMain.flashFSCommand(ASender: TObject; const command,
  args: WideString);
begin
//if (command = '!connect') then
//begin

//end;
end;

procedure TMain.timerTimer(Sender: TObject);
begin
if (net.Connected) then
  begin
    showmessage(net.ReadLn());
  end;
end;

procedure TMain.netConnected(Sender: TObject);
begin
  timer.Enabled := true;
  showmessage('Verbunden');
end;

procedure TMain.netDisconnected(Sender: TObject);
begin
  timer.enabled := false;
end;

procedure TMain.Button1Click(Sender: TObject);
begin
net.Connect(2000);
end;

end.
Der Server schickt die Daten per Writeln.
Ich hoffe ihr könnt mir helfen ;)
Ich bedanke mich im vorraus :D

Duffy 25. Jun 2005 22:42

Re: Indy TCPClient: Readln() Problem
 
Hallo Kill0r,
dein Programm hängt sich nicht auf, es wartet lediglich bis Daten kommen. Da du aber alle 300ms über fen Timer ein Readln ausführst, wartet sich dein Programm zu Tode.

Schau Dir doch mal die Demos der Indy’s an, da gibt ein gutes Beispiel für einen Server und einen Client. Beides ist ein gutes Gerüst, um darauf aufzubauen.

Bye
Claus

Kill0r 26. Jun 2005 00:21

Re: Indy TCPClient: Readln() Problem
 
Ja ok ich schau mir die Demos an ;)
Danke :D
Ich find nur merkwürdig das der Server dann wenn der Client wartet, einen Thread Timeout bekommt also die Verbindung ganz rausfliegt. Naja wird wahrscheinlich irgendie überlastet sein der Client, das es die verbindung raushaut.
Der Thread kann nun geschlossen werden ;)

Cu
Kill0r


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz