飘易最近使用delphi开发了一个软件,使用indy的TIDftp组件,由于indy是阻塞式的通讯方式,所以在网络出现异常或服务器失去响应的情况下,TIDFTP的connect方法就会卡死大约20秒的时间。
具体的原始代码是(INDY10版本):
procedureTForm1.Button1Click(Sender:TObject);上面IdFTP1.ConnctTimeout设置不一定起作用,经过测试,只有当网络正常并且服务器正常响应的情况下,ConnctTimeout方法才起作用,但是当网络断开时或服务器失去响应或服务器并未开放21端口时,IdFTP1.connect这个语句就会一直卡死20秒钟,而这个20s对于批量操作来说是太长了。用tryexcept捕获错误是“SocketError#10054Connectionresetbypeer”。原因是由于indy的tidftp是阻塞式通讯,也就意味了IdFTP1.connect不完成,整个线程都会一直等待下去,直到超时。
解决方法是不使用indy组件,而使用同样功能强大的异步通讯的ICS组件下的TFtpClient即可。
UsesOverbyteIcsWndControl,OverbyteIcsFtpCli;ICS下的TFtpClient组件的FtpClient1.Timeout是起作用的,即使在网络断开或服务器失去响应的情况下,timeout方法一样起作用。InternetComponentSuite就是大名鼎鼎的ICS,免费提供ICS-SSL,提供SSL支持,支持代理,非堵塞式通讯。
官方网站:http://www.overbyte.be
最新版本:[DownloadICS-V7Distribution(Sep12,2009)],SupportallDelphi7-2010andBCBversion2006-2010,ICS-SSLincludedforfree.
直接下载地址:http://www.overbyte.be/arch/OverbyteIcsV7.zip
ICS的安装方法:
下载完成后解压到delphi的lib目录(注,使用的是delphi2007)!
1、在Tools>Options>DelphiOptions>librarywin32>librarypath里加入$(BDS)\Lib\OverbyteIcsV7\Delphi\Vc32目录。
2、打开lib\OverbyteIcsV7\Delphi\Vc32下的OverbyteIcsD2007Design.dproj文件。(文件名在其它Delphi版本略有不同)
3、在项目管理器中,右键OverbyteIcsD2007Design.dproj选择Build和Install,就安装完成了!