【问题标题】:Resume EIdSocketError connection without restarting the download - Delphi在不重新启动下载的情况下恢复 EIdSocketError 连接 - Delphi
【发布时间】:2014-01-22 18:17:38
【问题描述】:

美好的一天……

我下载了一个程序,它使用except on E: EIdSocketError the begin 生成错误 Socket'm ...他向我展示了生成的错误...但我想解决这个错误...因为它与我的站点断开连接正在下载,他为程序,我无法返回任何下载...除非您关闭程序并重新打开...

我怎么会得到这个错误,让他尝试重置与站点的新连接,而无需重新启动程序......所以我回去下载最新下载的文件......因为套接字错误有重新启动程序并返回下载零 ... 1mb 文件很小,但下载量约为 200:

on E: EIdSocketError do begin
                     ShowMessage('Socket 2');

                     // +++++------
                     FreeAndNil(fileDownload);
                     fileDownload := TFileStream.Create(local_exe+'media_'+IntToStr(down_num)+'.mp4', fmCreate);
                     IdHTTP.Get(montarURL, fileDownload);
                     Memo1.Lines.Add(formatdatetime('dd/mm/yyyy',now)+' '+formatdatetime ('hh:mm:ss',now)+' Lista '+IntToStr(numero_tentativa_loop_um)+'. Connection restored.');
                 end;

【问题讨论】:

  • 你有哪个版本的Delphi?你能在你的问题中包含一个 Delphi 版本标签吗?
  • 我有一个 Delphi XE3 版本...

标签: delphi indy delphi-xe3


【解决方案1】:

EIdSocketError 就像它的名字所说的那样——发生了一个套接字错误。在没有看到所涉及的实际套接字错误代码的情况下,通常您可以做的只是Disconnect() 套接字、ClearIOHandler.InputBuffer 和重新Connect() 并从中断的地方继续下载(如果可能)或重新从头开始下载。

对于 HTTP,如果正在下载的资源接受 Range: bytes=... 请求标头(请参阅 TIdHTTP.Request.Range 属性),例如它报告了 Accept-Ranges: bytes 响应标头(请参阅 TIdHTTP.Response.AcceptRanges 属性),您可以恢复下载) 在较早的下载尝试中。详情请见RFC 2616 Section 14.35

更新:例如:

try
  IdHTTP.Get(montarURL, fileDownload);
except
  on E: EIdSocketError do begin
    IdHTTP.Disconnect;
    if IdHTTP.IOHandler <> nil then IdHTTP.IOHandler.InputBuffer.Clear;
    ...
    if IdHTTP.Response.AcceptRanges = 'bytes' then begin
      IdHTTP.Request.Range := IntToStr(fileDownload.Size) + '-';
    end else begin
      fileDownload.Size := 0;
    end;
    IdHTTP.Get(montarURL, fileDownload);
    ...
  end;
end;

【讨论】:

    【解决方案2】:

    Socket Error #10054 必须改正,因为是他出现的。。。不知道会不会和其他人一起使用:

    RemoveComponent(IdHTTP);
    IdHTTP.Free;
    IdHTTP := Nil;
    IdHTTP := TIdHTTP.Create(Self);
    

    ATT MT

    【讨论】:

    • 您无需销毁并重新创建 TIdHTTP 对象即可从套接字错误中恢复。
    • 这不是正确的答案。这是一种黑客解决方法,而不是解决方案。而且它没有解决从中断处继续下载而不是从头开始的问题。
    • 为什么要寻求帮助,然后当你从无可争议的 Stack Overflow Indy 专家那里得到帮助时,同样是 Indy 开发人员,你却忽略了它?如果你认为你已经什么都知道了,你怎么能学习呢?如果你这么想,为什么还要问?
    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 2012-05-13
    • 2014-03-11
    • 1970-01-01
    • 2011-03-04
    • 2011-09-13
    • 2012-07-25
    • 2023-03-21
    相关资源
    最近更新 更多