使用什么 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 客户端不是事件驱动的(该规则有一些例外,例如 TIdTelnet
和 TIdCmdTCPClient
)。你告诉 Indy 做某事,它就做那件事,并且 return 直到完成。如果出现问题,则会引发异常。
当客户端失去与服务器的连接时没有事件。关闭套接字后,下次尝试访问套接字时将引发异常(例如EIdConnClosedGracefully
)。您必须在 try/except
块中捕获该异常。然后,您可以 Disconnect()
并根据需要重新 Connect()
。
您的应用有责任不要闲置 15 分钟。如果用户长时间没有与您的应用程序交互,但您仍需要保持连接有效,您的应用程序可以使用计时器定期向服务器发送 NOOP
s,如心跳。
当使用 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 客户端不是事件驱动的(该规则有一些例外,例如 TIdTelnet
和 TIdCmdTCPClient
)。你告诉 Indy 做某事,它就做那件事,并且 return 直到完成。如果出现问题,则会引发异常。
当客户端失去与服务器的连接时没有事件。关闭套接字后,下次尝试访问套接字时将引发异常(例如EIdConnClosedGracefully
)。您必须在 try/except
块中捕获该异常。然后,您可以 Disconnect()
并根据需要重新 Connect()
。
您的应用有责任不要闲置 15 分钟。如果用户长时间没有与您的应用程序交互,但您仍需要保持连接有效,您的应用程序可以使用计时器定期向服务器发送 NOOP
s,如心跳。