Entwickler-Ecke

Internet / Netzwerk - ClientSocket in Delphi 6 lässt dich nicht aktivieren


Feldprediger - Mi 07.09.05 20:36
Titel: ClientSocket in Delphi 6 lässt dich nicht aktivieren
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 user profile iconraziel: Code- durch Delphi-Tags ersetzt.


Narses - Mi 07.09.05 21:00

Moin und :welcome: 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 - Do 08.09.05 09:54

Dein Tip mit den Indy-Components ist klasse :D . Nur schade, dass ich soviel Zeit mit dem ClientSocket verschwendet habe... :x :roll:
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 - 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. :D


Feldprediger - Do 08.09.05 17:56

ahso! :wink:
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
    { Private-Deklarationen }
    HTTPClient: TIdHTTP;
    function BPM_Request(Option, ServerIP: string): string;
    function IntToBool(Int : Integer): Boolean;
  public
    //constructor Create();
    //destructor Destroy; override;
    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 user profile iconraziel: Code- durch Delphi-Tags ersetzt.


Feldprediger - 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:
http://www.delphi-forum.de/viewtopic.php?t=47016&start=0&postdays=0&postorder=asc&highlight=

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.


Feldprediger - 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