Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TClientsocket verbindet sich nur einmal (https://www.delphipraxis.net/129881-tclientsocket-verbindet-sich-nur-einmal.html)

k6n 27. Feb 2009 01:02


TClientsocket verbindet sich nur einmal
 
Hallo,

Ich experimentiere gerade ein bisschen mit dem TClientSocket rum und bin dabei auf ein Problem gestoßen.
Ich habe eine Listbox mit einigen Testhosts, die auf jeden Fall alle erreichbar sind. (google, ebay usw...)
Jetzt möchte ich mich zu jedem Host nacheinander einmal verbinden, beim ersten mal klappt es ohne Probleme, doch beim 2. Aufruf von sock.open passiert überhaupt nichts mehr.

Woran könnte das liegen, muss man den Socket nach dem ersten Open zurücksetzen oder so?
Habe vieles ausprobiert, aber es geht einfach nicht, wieso? :cry:
Es wird auch keine Exception o.Ä geworfen, es passiert ganz einfach nichts!
An den Hosts liegt es definitiv nicht.
Der onDisconnect() Event tritt auch jedesmal korrekt wieder auf, aber er öffnet das Socket beim 2. Mal nicht mehr. Ich verstehe nicht wieso. :wall:

Hier ein Beispiel:
Delphi-Quellcode:
var i: integer;

//ButtonClick
i := 0;
sock.host := listbox1.items[i];
sock.port := 80;
sock.open;

//onConnect()
socket.sendtext('GET / HTTP/1.1'+#13#10+'Host: 'socket.remotehost+#13#10#13#10);

//onDisconnect()
listbox1.items[i] := listbox1.items[i] + ' ok';
inc(i);
//sock.close;
sock.host := listbox1.items[i];
sock.port := 80;
sock.open; //ab hier passiert nix mehr, wieso?
Danke für jeden Tipp.

nuclearping 27. Feb 2009 07:44

Re: TClientsocket verbindet sich nur einmal
 
sock.close?

Und warum socket.sendtext und nicht sock.sendtext?

SirThornberry 27. Feb 2009 08:29

Re: TClientsocket verbindet sich nur einmal
 
socket ist wohl der Parameter der im OnConnect übergeben wird. Von daher ist es sicher richtig so.

k6n 27. Feb 2009 12:41

Re: TClientsocket verbindet sich nur einmal
 
sock.close hatte ich schon ausprobiert, das bringt auch nichts. Und socket.sendtext() ist schon richtig, wie SirThornberry schon gesagt hat.

Hat noch jemand eine Idee, woran das liegen könnte? :gruebel:

k6n 27. Feb 2009 13:30

Re: TClientsocket verbindet sich nur einmal
 
Ich habe nun endlich herausgefunden, woran es liegt, und zwar liegt es daran, dass man im OnDisconnect() den Socket nicht gleich wieder öffnen darf, da dieser dort noch nicht freigegeben bzw. resettet wurde, d.h man kann es erst wieder öffnen, nachdem das Event ausgelöst wurde.

Jetzt bleibt nur noch die Frage, wie man das am besten machen kann. Man könnte einen Timer nehmen oder geht es auch noch anders besser?

Danke!

nuclearping 27. Feb 2009 13:50

Re: TClientsocket verbindet sich nur einmal
 
Genereller Tipp: Ich würde dir empfehlen, die Indy TCP Komponenten zu nehmen und dich nicht erst an die TSockets von Delphi zu gewöhnen.

k6n 27. Feb 2009 14:01

Re: TClientsocket verbindet sich nur einmal
 
Zitat:

Zitat von nuclearping
Genereller Tipp: Ich würde dir empfehlen, die Indy TCP Komponenten zu nehmen und dich nicht erst an die TSockets von Delphi zu gewöhnen.

Und wieso? Was ist an den Indy TCP Kompos denn besser?

SirThornberry 28. Feb 2009 12:37

Re: TClientsocket verbindet sich nur einmal
 
Zitat:

Zitat von nuclearping
Genereller Tipp: Ich würde dir empfehlen, die Indy TCP Komponenten zu nehmen und dich nicht erst an die TSockets von Delphi zu gewöhnen.

Der Grund für Meinung würde mich ebenfalls interessieren. Ich nutze die Indies wenn dies angebracht ist und die Sockets wenn dies angebracht ist. Beides hat seine Daseinsberechtigung und immer gleich alles mit Indys (und somit Threads) aufzublähen finde ich nicht ganz so prickelnd.

alzaimar 28. Feb 2009 13:53

Re: TClientsocket verbindet sich nur einmal
 
Der Indy TCP-Client macht meines Wissens nach auch Probleme, wenn man vom Server etwas asynchron empfangen will: Es existiert also kein 'OnServerData' Ereignis o.ä. Man muss sich mit Polling behelfen, was auf einer Event-basierten Maschine (Windows) ziemlicher Blödsinn ist.

mjustin 28. Feb 2009 19:24

Re: TClientsocket verbindet sich nur einmal
 
Zitat:

Zitat von k6n
Zitat:

Zitat von nuclearping
Genereller Tipp: Ich würde dir empfehlen, die Indy TCP Komponenten zu nehmen und dich nicht erst an die TSockets von Delphi zu gewöhnen.

Und wieso? Was ist an den Indy TCP Kompos denn besser?

Dass sie blockierende Sockets verwenden. Ich habe mit asynchronem Nachrichtenempfang (ICS, TClientSocket) nicht die Möglichkeit, exakt solange Bytes vom Socket zu lesen, bis ich alle Daten zusammenhabe (gesteuert über eine Byteanzahl oder ein bestimmtes Zeichenmuster).
Stattdessen wird eine OnServerData o.ä. Methode aufgerufen und jedesmal nur ein Häppchen der Daten übergeben. Das heisst, ich muss bei jedem Häppchen analysieren, ob denn nun das Ende der Nachricht erreicht wurde, und ob im Häppchen eventuell schon der Anfang der nächsten Nachricht enthalten ist.

Bei Indy lese ich einfach bis zu einem bestimmten Kennzeichen einen Bytestrom aus, und diese Bytes sind dann meine Nachricht, fix & fertig zur Weiterverarbeitung.

Man kann ICS und TClientSocket zwar (soviel ich weiss) auch in blockierendem Modus betrieben, aber ClientSocket ist bereits deprecated und mit Indy und Synapse gibt es schon zwei mehr als brauchbare Lösungen.

Damit will ich jetzt natürlich nicht sagen, dass die Verwendung von ClientSocket irgendwie gefährlich oder antiquarisch ist :angel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz