Delphi:INDY组件IDFTP/IDHTTP的connecttimeout超时问题

DELPHI中,indy组件是一套性能还不错的网络套件,使用这个组件里的Tidftp、Tidhttp等功能可以十分方便地进行网络交互。但正是由于indy的功能太多了,封装了上百种的协议,也同时产生了不少的兼容问题,有些错误甚至需要重写indy底层协议才能解决。

飘易最近使用delphi开发了一个软件,使用indy的TIDftp组件,由于indy是阻塞式的通讯方式,所以在网络出现异常或服务器失去响应的情况下,TIDFTP的connect方法就会卡死大约20秒的时间。

具体的原始代码是(INDY10版本):

procedureTForm1.Button1Click(Sender:TObject);
var
IdFTP1:TIDFTP;
cn:boolean;
begin
IdFTP1:=TIdFTP.create(nil);
IdFTP1.UserName:='PIAOYI';
IdFTP1.PassWord:='PIAOYI';
IdFTP1.HostName:='WWW.PIAOYI.ORG';
IdFTP1.Port:=21;
IdFTP1.ConnctTimeout:=1000;//注意,这里的超时时间并不一定起作用,单位毫秒
cn:=IdFTP1.connect;
ifcnthen
form1.memo1.Lines.add('FTP打开成功!');
ifnotcnthen
form1.memo1.Lines.add('FTP打开失败!');
IdFTP1.free;
end;

上面IdFTP1.ConnctTimeout设置不一定起作用,经过测试,只有当网络正常并且服务器正常响应的情况下,ConnctTimeout方法才起作用,但是当网络断开时或服务器失去响应或服务器并未开放21端口时,IdFTP1.connect这个语句就会一直卡死20秒钟,而这个20s对于批量操作来说是太长了。用tryexcept捕获错误是“SocketError#10054Connectionresetbypeer”。原因是由于indy的tidftp是阻塞式通讯,也就意味了IdFTP1.connect不完成,整个线程都会一直等待下去,直到超时。

解决方法是不使用indy组件,而使用同样功能强大的异步通讯的ICS组件下的TFtpClient即可。

UsesOverbyteIcsWndControl,OverbyteIcsFtpCli;
procedureTForm1.Button2Click(Sender:TObject);
var
FtpClient1:TFTPClient;
cn:boolean;
begin
FtpClient1:=TFTPClient.create(nil);
FtpClient1.UserName:='piaoyi';
FtpClient1.PassWord:='piaoyi';
FtpClient1.HostName:='www.piaoyi.org';
FtpClient1.Port:='21';
FtpClient1.Timeout:=2;//单位秒
cn:=FtpClient1.connect;
ifcnthen
form1.memo1.Lines.add('FTP扫描成功!');
ifnotcnthen
form1.memo1.Lines.add('FTP扫描失败!');
FtpClient1.free;
end;

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,就安装完成了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个警告是由于在您的应用程序中使用了不受支持的反射操作所导致的。这可能是由于使用了旧版本的库或框架,或者由于代码中使用了不推荐的功能。 要解决这个警告,您可以尝试以下几种方法: 1. 更新您的应用程序中使用的库和框架,确保使用最新版本的软件包。 2. 检查您的代码,查找是否有使用反射操作的地方,并尝试使用更安全的替代方法。 3. 如果您使用的是Groovy语言,请确保您使用的是最新版本的Groovy,并检查是否有任何过时的功能或用法。 4. 如果您无法解决这个警告,您可以通过在启动应用程序时添加以下参数来禁用警告: - 在命令行中运行应用程序时,可以使用`--illegal-access=deny`参数。 - 如果是在Maven项目中,可以在`pom.xml`文件中的`<build>`部分添加以下配置: ```xml <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <compilerArgs> <arg>--illegal-access=deny</arg> </compilerArgs> </configuration> </plugin> </plugins> ``` - 如果是在Gradle项目中,可以在`build.gradle`文件中的`tasks.withType(JavaCompile)`部分添加以下配置: ```gradle tasks.withType(JavaCompile) { options.compilerArgs << "--illegal-access=deny" } ``` 请注意,禁用警告可能会导致某些功能无法正常工作,因此最好的解决方法是更新代码和依赖项以避免使用不受支持的反射操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值