| Autor |
Beitrag |
Feldprediger
Hält's aus hier
Beiträge: 5
|
Verfasst: Mi 07.09.05 20:36
Hallo,
ich habe mit einem ClientSocket eine Verbindung zu einem HTTP-Server hergestellt, GET geschickt und Daten zurück erhalten. Nun beendet der Server die Verbindung.
Bei meinem nächsten Aufruf erkennt das Programm, dass keine Verbindung mehr besteht Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if NOT HTTPClient.Socket.Connected then try HTTPClient.Active := True; except ShowMessage('Verbindung konnte nicht geöffnet werden'); end; |
und sollte mit obigen Code wieder eine Verbindung herstellen. Aber es kommt weder die except-message, noch wird
HTTPClient.Active auf "True" gesetzt. HTTPClient.Active bleibt weiterhin "False". Woran kann das liegen?
Grüße,
Stephan
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 07.09.05 21:00
Moin und  im Forum!
Ganz allgemein: TClientSocket ist sicherlich denkbar ungeeignet für die Kommunikation mit einem HTTP-Server. Schau dich mal nach den Indy-Komponenten um, die sind für sowas besser geeignet.
Zu deinem Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if NOT HTTPClient.Socket.Connected then try HTTPClient.Active := True; except ShowMessage('Verbindung konnte nicht geöffnet werden'); end; |
Du solltest auf HTTPClient.Active testen, nicht den Socket direkt. Wenn die Eigenschaft FALSE ist, dann sollte der obige try-except-Block auch funktionieren. Allerdings darfst du erst dann was mit der Verbindung "tun", wenn das Ereignis .OnConnected eingetreten ist, nicht - wie vielleicht vermutet - direkt nach dem HTTPClient.Active := TRUE.
cu
Narses
|
|
Feldprediger 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 08.09.05 09:54
Dein Tip mit den Indy-Components ist klasse  . Nur schade, dass ich soviel Zeit mit dem ClientSocket verschwendet habe...
Bei dem idHTTP ist mir aber ein Performanceproblem ausgefallen. Irgendwie scheint der ab und zu alle anderen Threads zu blockieren (z.B. Timer). Habe schon ConnectoinTimeout und ReadTimeout auf 100ms gesetzt, brachte aber nichts.
Gibt es vielleicht etwas äquivalentes zu TCriticalSection mit LowPriority?
Grüße,
Stephan
|
|
arj
      
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: Do 08.09.05 13:44
Es werden nicht alle Threads blockiert, sondern nur der aktuelle (ein Timer läuft nicht in einem eigenen Thread).
Die Lösung dieses Problems: Die Verbindung in einem extra Thread herstellen. 
|
|
Feldprediger 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 08.09.05 17:56
ahso!
wie geht das? Ist das einfach?
EDIT:
Habe mich ein wenig schlau gemacht und nun folgendes probiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type THTTPThread = class(TThread) private HTTPClient: TIdHTTP; function BPM_Request(Option, ServerIP: string): string; function IntToBool(Int : Integer): Boolean; public function GetData(ServerIP: string): TPlayer; end; |
Jetzt kommt (beim Programmstart) allerdings die Fehlermeldung, dass die Klasse TIdHTTP nicht gefunden wird, obwohl ich sie in die Uses-Liste aufgenommen habe.
Wie kommts?
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Feldprediger 
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 09.09.05 18:24
Also folgendes steht im Uses Abschnitt:
Delphi-Quelltext 1: 2: 3: 4:
| uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; |
EDIT: Problem gelöst:
www.delphi-forum.de/...r=asc&highlight=
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Feldprediger 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 10.09.05 17:07
Hallo,
ich habe die HTTP-Anfrage jetzt in einen eigenen Thread ausgegliedert, aber es kommt dennoch immerwieder vor, dass die Timer blockiert werden, wenn einen HTTP-Anfrage mal etwas länger dauert. Wie kann das sein?
Der Thread läuft ganz für sich und als Schnittstelle zw. Thread und Hauptprogramm nutze in eine globale Variable.
Aber selbst wenn ich im Hauptprogramm das auslesen der globalen Variable auskommentiere, kommt es zu den Performanceproblemen.
Abhilfe schafft nur das auskommentieren der HTTP-Anfrage im Thread...
Wie kann das sein?
Grüße,
Stephan
|
|
|