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

What Indy FTP Event To Use To Detect Connection Closed Gracefully

当使用 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 分钟,是否可以通过某种方式模拟 "Connection Closed Gracefully" 以便加快调试速度,因为我必须登录然后等待 15 分钟才能连接到关闭。

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

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

您的应用有责任不要闲置 15 分钟。如果用户长时间没有与您的应用程序交互,但您仍需要保持连接有效,您的应用程序可以使用计时器定期向服务器发送 NOOPs,如心跳。