AGB  ·  Datenschutz  ·  Impressum  







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

IdHTTP zu schnell?

Ein Thema von glkgereon · begonnen am 20. Apr 2006 · letzter Beitrag vom 27. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

IdHTTP zu schnell?

  Alt 20. Apr 2006, 17:40
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?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: IdHTTP zu schnell?

  Alt 20. Apr 2006, 20:05
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#3

Re: IdHTTP zu schnell?

  Alt 20. Apr 2006, 22:45
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?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#4

Re: IdHTTP zu schnell?

  Alt 21. Apr 2006, 14:07
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 ).

hier mein Code

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?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: IdHTTP zu schnell?

  Alt 22. Apr 2006, 15:45
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?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: IdHTTP zu schnell?

  Alt 22. Apr 2006, 15:56
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: IdHTTP zu schnell?

  Alt 22. Apr 2006, 16:09
stimmt, in dem Sinne ist es schon unperformant was sich aber kaum bemerkbar machen sollte da nicht 100000 Anfragen gleichzeitig rein kommen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#8

Re: IdHTTP zu schnell?

  Alt 22. Apr 2006, 21:16
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^^
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#9

Re: IdHTTP zu schnell?

  Alt 23. Apr 2006, 09:50
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 (weil es die Daten dann nur über POST entgegennimmt)
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#10

Re: IdHTTP zu schnell?

  Alt 23. Apr 2006, 10:33
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 (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...
»Unlösbare Probleme sind in der Regel schwierig...«
  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 14:22 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