Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy TCPclient Disconnect Problem (https://www.delphipraxis.net/58379-indy-tcpclient-disconnect-problem.html)

th_bone 6. Dez 2005 10:36


Indy TCPclient Disconnect Problem
 
Hi,

folgender Ausgangspunkt (Indy10) ich habe eine Form mit einem
Programm1
TCPserver(Port 1700) und
TCPclient(Port 1701)

die sich zu einem 2ten program mit ebenfalls

Programm2
TCPclient (Port 1700) und
TCPserver (Port 1701) verbinden sollen

soweit so gut den server starte ich jeweils automatisch bei Programmstart

dann connecte ich die clients per button

Delphi-Quellcode:
procedure TForm1.BTconnectClick(Sender: TObject);
begin
  if TCPclient.Connected=false then begin
    TCPClient.Create.Host := '127.0.0.1';
    TCPClient.Create.Port := 1701; // beim 2ten Prog Port 1700
    TCPClient.create.Connect;
  end else begin
    TCPClient.Disconnect;
  end;
end;
jetzt das Problem:

Client disconnect funktioniert serverseitig ohne probleme ABER
der client denkt weiterhin er ist connected - sprich jeder versuch
wieder zu connecten schlägt fehl... wenn ich den connect über einen
2ten button versuche, dann kommt die meldung das der client bereits
connected wäre - was er aber definitiv nicht ist

Bin im Moment völlig ratlos..

Danke

Ralf

Zacherl 6. Dez 2005 11:40

Re: Indy TCPclient Disconnect Problem
 
Dieses Problem habe ich auch. Wäre schön, wenn jemand eine Lösung wüsste.

th_bone 6. Dez 2005 12:28

Re: Indy TCPclient Disconnect Problem
 
Hi,

habe gerade das Problem gefunden...

ich habe einen timer der auf Messages vom Server reagieren soll...

Delphi-Quellcode:
procedure TForm1.TimerGetMessageTimer(Sender: TObject);
var
  Msg, MsgStr : String;
  MsgCom  : Integer;
begin
  // wenn nicht connected
  if not TCPClient.Connected then exit;

  Msg := TCPClient.iohandler.ReadLn('', 5);

  if Msg<>'' then begin
    MsgCom :=strtoint(Msg[1]);
    MsgStr :=trim(Msg);
    delete(MsgStr,1,1);

    case MsgCom of
     stERROR      : begin
                     end;
     stMessage    : begin
                       MemoAdd(MsgStr);
                     end;
    end;
  end;
end;
und das "TCPClient.iohandler.ReadLn('', 5);" scheint die connection clientseitig
am leben zu halten...

Lösung:

Delphi-Quellcode:
procedure TForm1.BTconnectClick(Sender: TObject);
begin
  if TCPclient.Connected=false then begin
    TCPClient.Create.Host := '127.0.0.1';
    TCPClient.Create.Port := 17125;
    TCPClient.create.Connect;
    timergetmessage.Enabled:=true;
  end else begin
    timergetmessage.enabled:=false;
    TCPClient.Disconnect;
  end;
end;
Tschö

Ralf

@Florian Bernd: ich glaube wir sind die einzigen die mit Indy10 herumexperimentieren...

Zacherl 6. Dez 2005 12:37

Re: Indy TCPclient Disconnect Problem
 
Danke für die Antwort. Ich werd's gleich mal testen.

Zitat:

ich glaube wir sind die einzigen die mit Indy10 herumexperimentieren...
Kann durchaus sein.

Florian

WIng2005 7. Mär 2017 21:31

AW: Indy TCPclient Disconnect Problem
 
Hallo zusammen,

ich muss den doch schon relativ alten Beitrag noch einmal aufgreifen.

Ich versuche mich wechselnd auf mehrere Arduinos connecten. Daher ist es wichtig, dass die Verbinung jedesmal gesichert getrennt wird. Folgender Test:

Delphi-Quellcode:
try
    Mainform.TCPClient1.host:='192.168.1.177';
    Mainform.TCPClient1.Port:=23;
    Mainform.TCPClient1.Connect;
    Mainform.TCPClient1.IOHandler.WriteLn(#13);
    sleep(100);
    for i:=1 to 5 do Begin
      x:= IntTostr(i mod 2);
      Mainform.TCPClient1.IOHandler.WriteLn('setport #'+ (edit1.text)+','+x );
      sleep(100);
    end;
    showmessage('Fertig');
finally
    Mainform.TCPClient1.Disconnect;
end;

Parallel dazu habe ich mal die beiden Events OnConnected und OnDisconnected belegt, welche auch beide aufgerufen werden:

Delphi-Quellcode:
procedure TMainform.TCPClient1Connected(Sender: TObject);
begin
Showmessage('Connected');
end;

procedure TMainform.TCPClient1Disconnected(Sender: TObject);
begin
showmessage('Disconnected');
end;
Trotzdem, wird beim 2 Aufruf von Mainform.TCPClient1.Connect eine Exception geworfen, die sagt, dass die Verbindung bereits bestehen würde (EIdAlreadyConnected - Verbindung besteht bereits).

Ist diese Version ungeschickt, oder das Ergebnis ein Bug?

Ich verwende Delphi 10.1 Berlin Starter in der Standard-Installation (Indy 10.1.5 ?).

Vielen dank für jede Hilfe!

WIng2005 8. Mär 2017 17:29

AW: Indy TCPclient Disconnect Problem
 
Hallo zusammen,

ich habe noch ein wenig experimentiert, jedoch keine Lösung gefunden, solange ich den TCPClient über die VCL einfüge.
Abhilfe hat jedoch geschafft, wenn ich ihn dynmaisch zur Laufzeit erstelle:

Delphi-Quellcode:
procedure TMainform.Button3Click(Sender: TObject);
var TCPClient2: TIdTCPClient;
    i:integer;
    x:string;
begin
try
  TCPClient2:=TIdTCPClient.Create(nil);
  TCPClient2.host:='192.168.1.177';
  TCPClient2.Port:=23;
  TCPClient2.Connect;
  TCPClient2.IOHandler.WriteLn(#13);
    sleep(100);
    for i:=1 to 5 do Begin
      x:= IntTostr(i mod 2);
      TCPClient2.IOHandler.WriteLn('setport #'+ (edit1.text)+','+x );
      sleep(100);
    end;
    showmessage('Fertig');
finally
    TCPClient2.Free;
end;

end;
So lässt sich die Prozedur zumindest mehrmals hintereinander ausführen, was andersrum nicht möglich war. Das könnte zwar nun eine Lösung sein, mich würde aber trotzdem interessieren, ob ich im esten Beispiel einen Fehler hatte, oder ob dies tatsächlich ein Bug ist.

nahpets 8. Mär 2017 19:15

AW: Indy TCPclient Disconnect Problem
 
Versuch' es mal bitte mit
Delphi-Quellcode:
 TCPClient1.Disconnect(True);

Hatte mit TIDHttp auch Probleme.

Nachdem ich hier im Forum irgendwo gelesen hatte, dass man Disconnect doch bitte mit Parameter Disconnect(True) aufrufen möge, hab' ich das geändert und seit dem keine Probleme mehr.

Vorher musste ich entweder das Programm nach 'nem Fehler neu starten oder halt bei jedem Aufruf 'ne neue Instanz von TIDHTTP herstellen und anschließend freigeben.

WIng2005 8. Mär 2017 19:47

AW: Indy TCPclient Disconnect Problem
 
Hallo Stephan,

keine Änderung...die Fehlermeldung kommt noch immer.

haentschman 9. Mär 2017 06:43

AW: Indy TCPclient Disconnect Problem
 
Moin...:P
Zitat:

Abhilfe hat jedoch geschafft, wenn ich ihn dynmaisch zur Laufzeit erstelle
...das ist auch die einzige Variante die funktioniert. 8-) Sowas hatte ich auch mal. (dunkel in Erinnerung)
Delphi-Quellcode:
try
  TCPClient2:=TIdTCPClient.Create(nil);
...aber das Create gehört vor das try. :thumb:

mjustin 9. Mär 2017 08:00

AW: Indy TCPclient Disconnect Problem
 
Zitat:

Zitat von WIng2005 (Beitrag 1363595)
mich würde aber trotzdem interessieren, ob ich im esten Beispiel einen Fehler hatte, oder ob dies tatsächlich ein Bug ist.

Wenn es tatsächlich Indy 10.1.5 ist, dann ist es eine sehr alte Version, die einen Bug enthalten könnte. Aktuell ist schon seit langer Zeit Indy 10.6.*


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:30 Uhr.
Seite 1 von 2  1 2      

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