AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TClientsocket verbindet sich nur einmal

Offene Frage von "k6n"
Ein Thema von k6n · begonnen am 27. Feb 2009 · letzter Beitrag vom 28. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
k6n

Registriert seit: 13. Feb 2009
13 Beiträge
 
#1

TClientsocket verbindet sich nur einmal

  Alt 27. Feb 2009, 01:02
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?
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.

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.
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: TClientsocket verbindet sich nur einmal

  Alt 27. Feb 2009, 07:44
sock.close?

Und warum socket.sendtext und nicht sock.sendtext?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: TClientsocket verbindet sich nur einmal

  Alt 27. Feb 2009, 08:29
socket ist wohl der Parameter der im OnConnect übergeben wird. Von daher ist es sicher richtig so.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
k6n

Registriert seit: 13. Feb 2009
13 Beiträge
 
#4

Re: TClientsocket verbindet sich nur einmal

  Alt 27. Feb 2009, 12:41
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?
  Mit Zitat antworten Zitat
k6n

Registriert seit: 13. Feb 2009
13 Beiträge
 
#5

Re: TClientsocket verbindet sich nur einmal

  Alt 27. Feb 2009, 13:30
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!
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: TClientsocket verbindet sich nur einmal

  Alt 27. Feb 2009, 13:50
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.
  Mit Zitat antworten Zitat
k6n

Registriert seit: 13. Feb 2009
13 Beiträge
 
#7

Re: TClientsocket verbindet sich nur einmal

  Alt 27. Feb 2009, 14:01
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: TClientsocket verbindet sich nur einmal

  Alt 28. Feb 2009, 12:37
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: TClientsocket verbindet sich nur einmal

  Alt 28. Feb 2009, 13:53
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#10

Re: TClientsocket verbindet sich nur einmal

  Alt 28. Feb 2009, 19:24
Zitat von k6n:
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
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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