Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   IdTCPClient Komponente (https://www.delphipraxis.net/164694-idtcpclient-komponente.html)

Jerry 25. Nov 2011 10:21

IdTCPClient Komponente
 
Hallo zusammen

Ich habe eine kleines Programm geschrieben, dass den Port testen soll, ob dieser connected werden kann.

Auf einem Button habe ich folgenden Code hinterlegt:

Delphi-Quellcode:
procedure Tfrm_POP3SMTPTester.Button1Click(Sender: TObject);
begin
  try
    IdTCPClient.Host := edt_PortHost.Text;
    IdTCPClient.Port := StrToInt(edt_PortNr.Text);
    IdTCPClient.ConnectTimeout := 2000;
    IdTCPClient.Connect; // (4000);
    if IdTCPClient.Connected then
    begin
      showmessage('Connect hergestellt!');
      IdTCPClient.Disconnect;
    end;
  except
    on E: EIdTextInvalidCount do
      Writeln(E.Message);
    on E: EIdMessageCannotLoad do
      Writeln(E.Message);
    on E: EIdPOP3Exception do
      Writeln(E.Message);
    on E: EIdTextInvalidCount do
      Writeln(E.Message);
    on E: EIdMessageCannotLoad do
      Writeln(E.Message);
    on E: EIdDoesNotSupportAPOP do
      Writeln(E.Message);
    on E: EIdUnrecognizedReply do
      Writeln(E.Message);
    on E: EIdTLSClientException do
      Writeln(E.Message);
    on E: EIdTLSClientSSLIOHandlerRequred do
      Writeln(E.Message);
    on E: EIdTLSClientCanNotSetWhileConnected do
      Writeln(E.Message);
    on E: EIdTLSClientTLSNotAvailable do
      Writeln(E.Message);
    on E: EIdTLSClientTLSNegCmdFailed do
      Writeln(E.Message);
    on E: EIdTLSClientTLSHandShakeFailed do
      Writeln(E.Message);
    on E: EIdTLSServerException do
      Writeln(E.Message);
    on E: EIdTLSClientCanNotSetWhileActive do
      Writeln(E.Message);
  end;
  if IdTCPClient.Connected then
    IdTCPClient.Disconnect;
end;
Es funktioniert einwandfrei, aber beim zweiten Connect also bei zweiten mal drücken auf den Button erschein jedesmal
die Meldung "Already Connected". Was mache ich hier falsch?
Ich gebe ja den Befehl IdTCPClient.Disconnect ab...?

Ebenfalls erschein im Debug-Modus vor der Fehlerausgabe die Meldung:
Im Projekt test.exe ist eine Exeption der Klasse EIdAlreadyConnected mit der Meldung 'Already connected' aufgetreten. (Wie gesagt aber nur ab dem zweiten mal bei Drücken des Buttons)

Vielen Dank für Inputs...

Grüsse Jerry.

Jerry 25. Nov 2011 14:58

AW: IdTCPClient Komponente
 
nobody out there...? :-)

himitsu 25. Nov 2011 17:10

AW: IdTCPClient Komponente
 
Versuch mal:
Delphi-Quellcode:
begin
  try
    IdTCPClient.Disconnect;
    IdTCPClient.Host := edt_PortHost.Text;


Indy, DBX, DataSnap und Co. haben gerne mal Probleme, wenn die Connection (von extern) getrennt wurde, bzw. wenn sie nicht richtig aufgebaut werden konnte.

Connected liefert dann True, obwohl es getrennt ist.
Delphi-Quellcode:
if IdTCPClient.Connected then
  IdTCPClient.Disconnect;

Bummi 25. Nov 2011 22:09

AW: IdTCPClient Komponente
 
leicht OT, aber warum unterscheidest Du die Exceptionfälle wenn alle gleich behandelt werden?

Jerry 27. Nov 2011 11:57

AW: IdTCPClient Komponente
 
Hallo Bummi

Danke für Deine Antwort.

Was heisst OT?

Ja ich muss zugeben bei der Exeption bin ich mir nicht sicher ob das korrekt ist so..
Hast du mir hier einen besseren Tipp?

Dankeeee! :-)

Bummi 27. Nov 2011 12:35

AW: IdTCPClient Komponente
 
Delphi-Quellcode:
on E: Exception do
würde alle abfackeln, OT heißt Off Topic, meine Antwort hatte mit Deinem Problem nicht wirklich etwas zu tun....

himitsu 27. Nov 2011 13:23

AW: IdTCPClient Komponente
 
Jupp, die On-Sektionen entsprechen einer IS-Prüfung und die prüft, ob mindestens dieser Type vorliegt (Type + alle Nachfahren)

PS: Da dort der Else-Block fehlt, würden alle nicht angegebenen Exceptions einfach übersehn/ignoriert.
Da Exception der Basistyp aller Exceptions-Klassen ist, würde der alle Exceptions abfangen.

Delphi-Quellcode:
except
  on E: Exception do
    WriteLn(E.ClassName, ': ', E.Message); // eventuell sogar noch den Exception-Typen mit ausgeben
end;

Jerry 7. Dez 2011 07:48

AW: IdTCPClient Komponente
 
hallo vielen Dank für die Inputs...

Eine Frage wollte ich noch beantworten:

leicht OT, aber warum unterscheidest Du die Exceptionfälle wenn alle gleich behandelt werden?

Ich habe viel mit pop3 und SMTP und Ports zu tun. Ich musste mir ein Programm schreiben, das POP3 und SMTP und Ports prüft.

Ich musste meine Kunden davon überzeugen, dass Ihr Mailaccount ein Problem hat. Wenn innerhalb einer Application die recht gross ist, der Mailzugnang nicht funktioniert hat,
dann meinen die Kunden immer, es wäre das Programm selber das ein Problem hat. Ich konnte die Kunden nur immer schwer davon überzeugen, dass das Problem bei Ihrem Provider/Mailserver liegt.
Mit dieser kleinen unabhängigen Applikation kann ich den Kunden immer davon überzeugen, dass es nichts mit der eigentlichen Applikation zu tun hat, sondern es an seinem Mailprovider / Mailserver liegt.

Die verschiedenen Exceptionfälle geben mir eben immer den entsprechenden Fehler aus. z.B: Login faild oder User unknown usw. Jedenfalls funktioniert es so recht gut... :-)

Allen einen schönen Tag!
Gruss Jerry

himitsu 7. Dez 2011 10:17

AW: IdTCPClient Komponente
 
Zitat:

Zitat von Jerry (Beitrag 1139936)
Die verschiedenen Exceptionfälle geben mir eben immer den entsprechenden Fehler aus. z.B: Login faild oder User unknown usw. Jedenfalls funktioniert es so recht gut... :-)

Eben nicht, denn du machts immer genau das Selbe, egal welcher Fehler.
Und dazu könntest du auch Fehler übersehn, falls diese nicht vorkommen, in deiner Liste.

Folgendes macht also genau das Gleiche, nur daß es keine Exceptions mehr übersieht.
Delphi-Quellcode:
except
  on E: Exception do
    WriteLn(E.Message);
end;
Alternativ:
Delphi-Quellcode:
except
  on E: EIdTextInvalidCount do
    Writeln(E.Message);
  ...
  on E: EIdTLSClientCanNotSetWhileActive do
    Writeln(E.Message);
  on E: Exception do
    WriteLn(E.Message); // das, was du sonst übersehn könntest
  else
    WriteLn('ganz komischer Fehler'); // kommt aber "eigentlich" nie vor, da Exceptions ja eine Exceptionklasse besitzen und diese "immer" vom Typ Exception abstammen sollt.
end;
Wenn du wirklich wissen willst, welcher Fehler es genau war, dann eher so:
Delphi-Quellcode:
except
  on E: Exception do
    WriteLn(E.ClassName, ': ', E.Message);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:14 Uhr.

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