Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdHTTP zu schnell? (https://www.delphipraxis.net/67838-idhttp-zu-schnell.html)

glkgereon 20. Apr 2006 16:40


IdHTTP zu schnell?
 
Hi,

Ich programmieren mit Hilfe von TIdHTTPServer und TIdHTTP einen HTTP-Proxy...

das ganze sieht bisher in etwa so aus:
Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var URL: String;
begin
  URL:='http://'+ARequestInfo.Host+ARequestInfo.Document+CreateParamList(ARequestInfo.Params);
  AResponseInfo.ContentText:=IdHTTP1.Get(URL);
end;
Das ganze funktioniert auch für google.de gut.
Nur unsere gute alte delphipraxis bricht dem ganzen leider das Genick.
bei unterschiedlichen Dateien wirft er auf einmal folgende Exception: "Im Projekt Project1.exe ist eine Exception der Klasse EIdSocketError mit der Meldung 'Socket Error # 10022 Invalid argument.' aufgetreten."

Das ganze tritt allerdings NICHT auf, wenn ich zwischen jeder Datei eine ShowMessage bestätige.
Ich vermute daher das der aufruf der nächsten Datei einfach schneller kommt als IdHTTP die Datei vorher fertig hat, und dann einfach ne Exception wirft.
Kann ich das irgendwie abfragen ob IdHTTP noch am basteln ist?
oder direkt vermeiden?

SirThornberry 20. Apr 2006 19:05

Re: IdHTTP zu schnell?
 
du bräuchtest dir nur eine Variable im Private dafür anlegen auf der du dir merkst ob der httpclient in Verwendung ist. Besser fände ich jedoch das du mehrere TIdhttp verwendest und je nach dem welches gerade frei ist genutzt wird (um auch die volle bandbreite nutzen zu können)

glkgereon 20. Apr 2006 21:45

Re: IdHTTP zu schnell?
 
Zitat:

Zitat von SirThornberry
du bräuchtest dir nur eine Variable im Private dafür anlegen auf der du dir merkst ob der httpclient in Verwendung ist. Besser fände ich jedoch das du mehrere TIdhttp verwendest und je nach dem welches gerade frei ist genutzt wird (um auch die volle bandbreite nutzen zu können)

Delphi-Quellcode:
procedure TForm1.ServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var URL: String;
begin
  URL:='http://'+ARequestInfo.Host+ARequestInfo.Document+CreateParamList(ARequestInfo.Params);
  try
    while Client.Tag=1 do Application.ProcessMessages;
    Client.Tag:=1;
    AResponseInfo.ContentText:=Client.Get(URL);
    Client.Tag:=0;
  except
  end;
end;
so funktioniert es tatsächlich^^

wie würdest du denn mehrere Clients intelligent organisieren?

glkgereon 21. Apr 2006 13:07

Re: IdHTTP zu schnell?
 
Haha :)

ich habe mich tatsächlich mal dran gesetzt und eine Klasse geschrieben welche mehrere IdHTTPs parallel downloaden lässt.
und es geht auch deutlich schneller (bilde ich mir zumindest ein :drunken: ).

hier mein Code :party:

Delphi-Quellcode:
unit UDownloader;

interface

uses IdHTTP, ExtCtrls, SysUtils, Windows;

type
  THTTPArray = array of TIdHTTP;
  TDownloader = class(TObject)
  private
    FHTTPs: THTTPArray; //Clients
    LastCall: Int64; //Last Use of Get
    FTimer: TTimer; //Timer to Clear Idle Clients
    function Add: Integer;
    procedure Clear;
    procedure ClearIdle;
    function GetIdle: Integer;
    procedure OnTimer(Sender: TObject);
  public
    constructor Create;
    destructor Destroy;
    function Get(URL: String): String;
  end;

implementation

constructor TDownloader.Create;
begin
  inherited;
  Clear;
  FTimer:=TTimer.Create(nil);
  FTimer.Interval:=5*60*1000; //5 minutes
  FTimer.OnTimer:=OnTimer;
  FTimer.Enabled:=True;
end;

destructor TDownloader.Destroy;
var i:Integer;
begin
  Clear;
  FTimer.Free;
  inherited;
end;

function TDownloader.Add: Integer;
//Add new Client, Return ID
begin
  Result:=Length(FHTTPs); //ID of new Client
  SetLength(FHTTPs,Result+1);
  FHTTPs[Result]:=TIdHTTP.Create;
  FHTTPs[Result].Tag:=0; //Not in use
  FHTTPs[Result].HandleRedirects:=True;
end;

procedure TDownloader.Clear;
//Clear alls Clients and set Array to 0
var i:Integer;
begin
  for i:=0 to Length(FHTTPs)-1 do
    FHTTPs[i].Free;
  SetLength(FHTTPs,0);
end;

procedure TDownloader.ClearIdle;
//Clear all Clients which are Idle, beginning from the back
var i:Integer;
begin
  for i:=Length(FHTTPs)-1 downto 0 do
    if FHTTPs[i].Tag=0 then
      begin
      FHTTPs[i].Free;
      SetLength(FHTTPs,i);
      end;
end;

function TDownloader.GetIdle: Integer;
//Get first idle Client
var i: Integer;
begin
  Result:=-1;
  for i:=0 to Length(FHTTPs)-1 do
    if FHTTPs[i].Tag=0 then
      begin
      Result:=i;
      Break;
      end;
end;

procedure TDownloader.OnTimer(Sender: TObject);
//Timer Event to clear idle Clients
begin
  if (GetTickCount-LastCall)>30*1000 then ClearIdle;
end;

function TDownloader.Get(URL: String): String;
//Download
var I: Integer;
begin
  LastCall:=GetTickCount;
  I:=GetIdle; //Get Idle
  if i=-1 then I:=Add; //If no idles, create new
  FHTTPs[i].Tag:=1; //client is in use
  Result:=FHTTPs[i].Get(URL); //download
  FHTTPs[i].Tag:=0; //client is no more in use
  LastCall:=GetTickCount;
end;

end.
Scheint eigentlich ganz gut zu funktionieren...irgendwelche verbesserungsvorschläge? :)


Edit:
es scheint aber irgendwie probleme zu geben wenn man auf nen link klickt bevor ganz geladen ist...kann das sein?
Zudem kommt, wenn ich über den Proxy diesen Beitrag hier zB editieren will "Kein Eintrags-Modus ausgewählt"...
Was heisst das?

SirThornberry 22. Apr 2006 14:45

Re: IdHTTP zu schnell?
 
eine Möglichkeit wäre auch noch das du den httpclient dynamich erzeugst und nachdem die Datei heruntergeladen ist, dieser client wieder freigegeben wird (so entfällt die Organisation). Das mit "kein Eintragsmodus gewählt" kann auch an den Cookies liegen. Hast du die irgendwie mit Integriert oder vergessen?

jfheins 22. Apr 2006 14:56

Re: IdHTTP zu schnell?
 
Dann hätte man aber viele Clients die man nur für einen Request erstellen würde und danach dann zerstören - also relativ unperformant ... oder nicht ?

SirThornberry 22. Apr 2006 15:09

Re: IdHTTP zu schnell?
 
stimmt, in dem Sinne ist es schon unperformant was sich aber kaum bemerkbar machen sollte da nicht 100000 Anfragen gleichzeitig rein kommen

glkgereon 22. Apr 2006 20:16

Re: IdHTTP zu schnell?
 
Zitat:

Zitat von SirThornberry
eine Möglichkeit wäre auch noch das du den httpclient dynamich erzeugst und nachdem die Datei heruntergeladen ist, dieser client wieder freigegeben wird (so entfällt die Organisation). Das mit "kein Eintragsmodus gewählt" kann auch an den Cookies liegen. Hast du die irgendwie mit Integriert oder vergessen?

nunja, eigentlich soll es so bleiben wie es atm^^
aber noch ein paar bugs raus und neues feature (dank an jfheins ;) )
werd ich dann wenns mal funzt im OS-Teil posten^^


Cookies...was muss ich denn dafür machen?
ich leite ja im prinzip alles einfach nur weiter...wie würde das denn aussehen?
hab da gar keine ahnung von^^

jfheins 23. Apr 2006 08:50

Re: IdHTTP zu schnell?
 
Mir ist ein wichtiges Problem aufgefallen, und zwar leitetst du POST-Daten per GET weiter - wenn das PHP-Script sauber pragrammiert ist, geht es nicht :mrgreen: (weil es die Daten dann nur über POST entgegennimmt)

glkgereon 23. Apr 2006 09:33

Re: IdHTTP zu schnell?
 
Zitat:

Zitat von jfheins
Mir ist ein wichtiges Problem aufgefallen, und zwar leitetst du POST-Daten per GET weiter - wenn das PHP-Script sauber pragrammiert ist, geht es nicht :mrgreen: (weil es die Daten dann nur über POST entgegennimmt)

wie ginge das denn?

Ich habe bei IdHTTP bisher nur Get benutzt^^
werd ich mir heut abend mal anschauen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:19 Uhr.
Seite 1 von 2  1 2      

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