【问题标题】:Indy FTP EIAcceptTimeout ExceptionIndy FTP EIAcceptTimeout 异常
【发布时间】:2014-08-26 14:49:41
【问题描述】:

我正在测试 IndyFTP 以将文件上传到服务器。 文件已上传,但有0字节,因为有一个EIdAccessTimeout异常 - 'Accept timed out'。如何防止该异常?我的代码不正确吗?代码如下所示:

procedure TForm1.FTPUpload1Click(Sender: TObject);
{ Indy FTP Upload. }
var
  iHost: string;
  iUsername: string;
  iPassword: string;
  iFolder: string;
  iSourceFile: string;
  iDestFile: string;
  iAppend: boolean;
  iStartPos: Int64;
begin
  iHost := FTPHost1.Text;
  iUsername := Username1.Text;
  iPassword := Password1.Text;
  iFolder := ServerFolder1.Text;
  if FileExists(SourceFile1.Text) then
    iSourceFile := SourceFile1.Text
  else
    Exit;
  if FileExists(SourceFile1.Text) then
    iDestFile := ExtractFileName(SourceFile1.Text)
  else
    Exit;
  iAppend := False;
  iStartPos := -1;
  IdFTP1.Host := iHost;
  IdFTP1.Username := iUsername;
  IdFTP1.Password := iPassword;
  IdFTP1.Connect;
  IdFTP1.TransferType := ftBinary;
  IdFTP1.Put(iSourceFile);
  IdFTP1.Disconnect;
end;

列出了一些未使用的变量,因为我只是在学习,还没有使用一些参数。

【问题讨论】:

    标签: delphi delphi-xe4


    【解决方案1】:

    很可能,您的 FTP 客户端设置为 ACTIVE 模式,因此此错误意味着在成功登录 FTP 服务器后,无法建立“反向”连接(文件传输)。

    在主动模式 FTP 中,客户端从随机的非特权端口连接 (N > 1023) 到 FTP 服务器的命令端口,端口 21。然后,客户端 开始监听端口 N+1 并发送 FTP 命令 PORT N+1 到 FTP 服务器。然后服务器将连接回客户端的 从其本地数据端口指定的数据端口,即端口 20。

    Active FTP vs. Passive FTP, a Definitive Explanation

    您可以这样设置为被动模式:

    IdFTP1.Passive := True;
    

    编辑

    另外,使用 try-except-finally 块,这样你可以做一些错误处理。类似的东西:

      try
        IdFTP1.Connect;
        try
          IdFTP1.Put(...);
        finally
          IdFTP1.Disconnect;
        end;
      except
        // couldn't connect
      end;
    

    【讨论】:

    • 谢谢彼得。一旦我添加了 IdFTP1.Passive := True 文件上传正确。 try finally 块会围绕 Connect 和 Put 进行吗?
    • Connect 可以引发异常,因此它必须在 try 块内。从技术上讲,Put 也可以引发异常(当目标文件名为空时),它也应该受到保护。此外,如果 Connect 引发 E,则自动调用 Disconnect。最后,在传输操作的内容发送成功后,AfterPut 事件处理程序被调用。
    • 如果你使用try/finally关闭连接,把Connect()放在之前try然后把Disconnect()放在里面 finally。不要将Connect() 放在 try 中。如果Connect() 引发异常,则无需调用Disconnect()Connect() 会在内部处理该异常。如果Put() 引发异常,您只需要调用Disconnect()。如果您使用的是try/except,则将Connect() 放入 try 是有意义的。
    • 感谢 Remy,我使用了后者的 try/except 块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2012-01-09
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多