Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdHttp - Connection closed Gracefully abfangen? (https://www.delphipraxis.net/134312-idhttp-connection-closed-gracefully-abfangen.html)

moelski 19. Mai 2009 18:04


IdHttp - Connection closed Gracefully abfangen?
 
Moin !

Ich nutze den Code hier (ist hier aus der Code-Lib) um eine Datei von einem Server zu laden:
Delphi-Quellcode:
Function TInstallForm.DownloadFile(Filename : String) : Boolean;
var BytesKopiert, BytesInsgesamt : int64;
    lStream                      : TFileStream;
    FileToLoad                   : String;
begin
  size.caption := '';
  //Initialiesieren
  Status.Caption := '';
  BytesKopiert := 0;
  Progress.Position := 0;
  //In edit 1 steht die downzuladene Datei (z.b. [url]http://www.server.com/datei.dat[/url])
  Status.Caption := 'Prüfe Header';
  // Durch die zwei nächsten Befehle wird die Größe ermittelt und ihn der Variable BytesInsgesamt abgespeichert
  FileToLoad := 'http://' + AppUpdateServer + '/'
                        + AppUpdateFolder + '/'
                        + AppName + ' '
                        + IntToStr(AppMajorVersion) + '/'
                        + Filename;
  FileToLoad := StringReplace(FileToLoad, ' ', '%20', [rfReplaceAll, rfIgnoreCase]);
 // ShowMessage(FileToLoad);
  IdHTTP.Head( FileToLoad );
  BytesInsgesamt := IdHTTP.Response.ContentLength;

  Log('Download : ' + AppName + ' ' + IntToStr(AppMajorVersion) + '/' + Filename, ClBlue);
  Log('HTTP Response : ' + Idhttp.Response.ResponseText, clBlack);

  Size.Caption := IntToStr(BytesInsgesamt);

 // Exit;

  //Wenn die Indy Komponente -1 zurückgibt dann bedeutet es des der die Dateigröße nicht zu verfügung
  //stellt uns somit kann die Datei ganz normall heruntergeladen werden (ohne Fortschrittsanzeige)
  if BytesInsgesamt = -1 then
  begin
    Status.Caption := 'Normalles herunterladen';
    Status.Caption := 'Erstelle Datei';
    //In Edit 2 steht welche Datei (z.b. C:\datei.dat)
    //Datei erstellen
    lStream := TFileStream.Create(TempFolder + Filename, fmCreate or fmShareDenyNone);
    try
      //und "normal" herunterladen
      idHTTP.Get(FileToLoad , lStream);
    finally
      if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt
    end;
    //Alles auf fertig stellen
    Status.Caption := 'Fertig';
    SpeedLabel.caption := 'Fertig';
    exit;
  end;
  //Also wenn wir hier angelangt sind dann bedeutet es der Server hat uns die Dateigröße zur Verfügung gestellt.
  Progress.Max := BytesInsgesamt;
  Status.Caption := 'Erstelle Datei';
  //In Edit 2 steht welche Datei (z.b. C:\datei.dat)
  //Datei erstellen
  lStream := TFileStream.Create(TempFolder + Filename, fmCreate or fmShareDenyNone);
  lStream.Position := 0;
  try
    repeat
      // Damit sich das Programm nicht aufhängt
      Application.ProcessMessages;

      //Hier wird gebrüft ob die restlichen Bytes größer sind als cFileSplitSize
      if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then
      begin
        //Hier wird einmal die cFileSplitSize eingestellt
        IdHttp.Request.Range := Format('%d-%d', [BytesKopiert, (BytesKopiert+cFileSplitSize-1)]);
      end
      else IdHttp.Request.Range := Format('%d-', [BytesKopiert]);

      Application.ProcessMessages;
      //Den eingesttelten Teil herunterladen und ihn die Datei speichern
      IdHTTP.Get(FileToLoad , lStream);
      //Progress und Status aktualliesieren
      Progress.Position := BytesKopiert;
      Status.Caption := GetSizeName(BytesKopiert) + ' / ' + GetSizeName(BytesInsgesamt);
      //BytesKopiert weiter setzen
      BytesKopiert := BytesKopiert+cFileSplitSize;
    until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig
  finally
    if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt
    IdHttp.Request.Range := '';
  end;
  //Alles auf fertig stellen
  Status.Caption    := 'Fertig';
  SpeedLabel.caption := 'Fertig';
  Progress.Position := Progress.Max;
end;

procedure TInstallForm.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  if not((GetTickCount - FTime) <= 0) then
  begin
    try
      SpeedLabel.caption := Format('%.2f KB/s', [(AWorkCount - FBytes) / (GetTickCount - FTime)]);
    except
    end;
  end;
  FTime := GetTickCount;
  FBytes := AWorkCount;
  Application.ProcessMessages;
end;

procedure TInstallForm.IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
  FTime := GetTickCount;
  FBytes := 0;
  Application.ProcessMessages;
end;
Manchmal bricht aber der Server die Verbindung ab und ich bekome eben "Connection closed gracefully". Kann mir jemand nen Tip geben wie ich das im Code abfangen muss / soll?
Muss ich das "IdHTTP.Get(FileToLoad , lStream);" mit Try Except umklammern?

mjustin 19. Mai 2009 19:22

Re: IdHttp - Connection closed Gracefully abfangen?
 
Zitat:

Zitat von moelski
Muss ich das "IdHTTP.Get(FileToLoad , lStream);" mit Try Except umklammern?

Ja, einfach die "passendste" Exception abfangen und dann die Methode geschickt verlassen.

Also z.B.

Delphi-Quellcode:
try
  ...
  ...
except
  on E:EIdConnClosedGracefully do
  begin
    ...
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:51 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