什么Indy FTP事件用于检测连接正常关闭

时间:2015-01-10 15:43:04

标签: delphi ftp indy delphi-xe7

使用Indy TIDFTP时,应该使用哪个事件来检测连接是否正常关闭?如果连接已关闭,那么重置TIDFTP的正确调用是什么,以便用户可以重新登录?

我已尝试使用IdFTP1Status事件,但即使连接在应用程序空闲15分钟时丢失,事件也不会执行。我在事件中放置了一个断点,但是从未到达断点,并且不执行事件中的代码。变量ALoggedIn在测试期间为真。

关于此主题的其他帖子建议IDFTP应重置为:

IdFTP1.Disconnect(False);
IdFTP1.IOHandler.InputBuffer.Clear;

以下是事件代码:

procedure TForm1.IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
{ Show the FTP server response to commands in the statusbar and detect disconnected. }
begin
  { If LoggedIn and connection is disconnected then logout and enable login }
  if (ALoggedIn) and (AStatus = hsDisconnected) then
  begin
    StatusBar1.SimplePanel := True;
    StatusBar1.SimpleText := 'FTP connection lost.  Please login again.';
    StatusBar1.Update;
    TaskMessageDlg('Connection Error',
      'FTP connection lost.  Please login again.', mtError, [mbOk], 0);
    IdFTP1.Disconnect(False);
    IdFTP1.IOHandler.InputBuffer.Clear;
  end
  else
  begin
    StatusBar1.SimplePanel := True;
    StatusBar1.SimpleText := AStatusText;
    StatusBar1.Update;
  end;
end;

此外,因为连接丢失需要15分钟才能模拟"连接正常关闭"因此,我必须登录然后等待15分钟以便关闭连接,从而加快调试速度。

1 个答案:

答案 0 :(得分:3)

在大多数情况下,Indy客户端不是事件驱动的(该规则有一些例外,例如TIdTelnetTIdCmdTCPClient)。你告诉Indy做某事,它做了那件事,直到完成才回来。如果出现问题,则会引发异常。

当客户端失去与服务器的连接时,没有任何事件。当套接字关闭时,下次尝试访问套接字时将引发异常(例如EIdConnClosedGracefully)。您必须在try/except块中捕获该异常。然后,您可以根据需要Disconnect()并重新Connect()

你的责任是不要闲着15分钟。如果用户长时间未与您的应用进行交互,但仍需要保持连接处于活动状态,则您的应用可以使用计时器定期将NOOP发送到服务器,就像心跳一样。