Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用哪个Indy FTP事件检测正常关闭的连接_Delphi_Ftp_Indy_Delphi Xe7 - Fatal编程技术网

Delphi 使用哪个Indy FTP事件检测正常关闭的连接

Delphi 使用哪个Indy FTP事件检测正常关闭的连接,delphi,ftp,indy,delphi-xe7,Delphi,Ftp,Indy,Delphi Xe7,使用Indy TIDFTP时,应使用什么事件来检测连接已正常关闭?如果连接已关闭,应进行哪些适当的调用来重置TIDFTP,以便用户可以重新登录 我尝试过使用IdFTP1Status事件,但即使在应用程序空闲15分钟时连接丢失,该事件也不会执行。我在事件中放置了一个断点,但从未达到该断点,事件中的代码也未执行。测试期间,变量ALoggedIn为真 关于此主题的其他帖子建议,IDFTP应重置为: IdFTP1.Disconnect(False); IdFTP1.IOHandler.InputBuff

使用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分钟以关闭连接。

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

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


你的应用程序有责任在15分钟内不空闲。如果用户没有与你的应用程序进行那么长时间的交互,但你仍然需要保持连接处于活动状态,你的应用程序可以使用计时器定期向服务器发送
NOOP
s,就像心跳一样。

你会将try/except块放在哪里?在计时器中发送命令每10秒使用一个try/except块?是。用try/except块包装TIdFTP代码的每一部分。