Delphi:INDY组件IDFTP/IDHTTP的connecttimeout超时问题
2012-07-30 22:29
796 查看
DELPHI中,indy组件是一套性能还不错的网络套件,使用这个组件里的Tidftp、Tidhttp等功能可以十分方便地进行网络交互。但正是由于indy的功能太多了,封装了上百种的协议,也同时产生了不少的兼容问题,有些错误甚至需要重写indy底层协议才能解决。
飘易最近使用delphi开发了一个软件,使用indy的TIDftp组件,由于indy是阻塞式的通讯方式,所以在网络出现异常或服务器失去响应的情况下,TIDFTP的connect方法就会卡死大约20秒的时间。
具体的原始代码是(INDY 10版本):
procedure TForm1.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;
if cn then
form1.memo1.Lines.add('FTP打开成功!');
if not cn then
form1.memo1.Lines.add('FTP打开失败!');
IdFTP1.free;
end;
上面 IdFTP1.ConnctTimeout 设置不一定起作用,经过测试,只有当网络正常并且服务器正常响应的情况下,ConnctTimeout方法才起作用,但是当网络断开时或服务器失去响应或服务器并未开放21端口时,IdFTP1.connect 这个语句就会一直卡死 20秒钟,而这个20s对于批量操作来说是太长了。用try except捕获错误是“SocketError #10054 Connection reset by peer”。原因是由于indy的tidftp是阻塞式通讯,也就意味了 IdFTP1.connect 不完成,整个线程都会一直等待下去,直到超时。
解决方法是不使用indy组件,而使用同样功能强大的异步通讯的ICS组件下的 TFtpClient 即可。
Uses OverbyteIcsWndControl, OverbyteIcsFtpCli;
procedure TForm1.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;
if cn then
form1.memo1.Lines.add('FTP扫描成功!');
if not cn then
form1.memo1.Lines.add('FTP扫描失败!');
FtpClient1.free;
end;
ICS下的 TFtpClient 组件的 FtpClient1.Timeout 是起作用的,即使在网络断开或服务器失去响应的情况下, timeout 方法一样起作用。Internet Component Suite就是大名鼎鼎的ICS,免费提供ICS-SSL,提供SSL支持,支持代理,非堵塞式通讯。
官方网站:http://www.overbyte.be
最新版本:[ Download ICS-V7 Distribution (Sep 12, 2009) ], Support all Delphi 7-2010 and BCB version 2006-2010, ICS-SSL included for free.
直接下载地址:http://www.overbyte.be/arch/OverbyteIcsV7.zip
ICS的安装方法:
下载完成后解压到delphi的 lib目录(注,使用的是delphi2007)!
1、在Tools > Options > Delphi Options > library win32 > library path 里加入 $(BDS)\Lib\OverbyteIcsV7\Delphi\Vc32 目录。
2、打开 lib\OverbyteIcsV7\Delphi\Vc32 下的 OverbyteIcsD2007Design.dproj 文件。(文件名在其它Delphi版本略有不同)
3、在项目管理器中,右键 OverbyteIcsD2007Design.dproj 选择Build和Install,就安装完成了!
飘易最近使用delphi开发了一个软件,使用indy的TIDftp组件,由于indy是阻塞式的通讯方式,所以在网络出现异常或服务器失去响应的情况下,TIDFTP的connect方法就会卡死大约20秒的时间。
具体的原始代码是(INDY 10版本):
procedure TForm1.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;
if cn then
form1.memo1.Lines.add('FTP打开成功!');
if not cn then
form1.memo1.Lines.add('FTP打开失败!');
IdFTP1.free;
end;
上面 IdFTP1.ConnctTimeout 设置不一定起作用,经过测试,只有当网络正常并且服务器正常响应的情况下,ConnctTimeout方法才起作用,但是当网络断开时或服务器失去响应或服务器并未开放21端口时,IdFTP1.connect 这个语句就会一直卡死 20秒钟,而这个20s对于批量操作来说是太长了。用try except捕获错误是“SocketError #10054 Connection reset by peer”。原因是由于indy的tidftp是阻塞式通讯,也就意味了 IdFTP1.connect 不完成,整个线程都会一直等待下去,直到超时。
解决方法是不使用indy组件,而使用同样功能强大的异步通讯的ICS组件下的 TFtpClient 即可。
Uses OverbyteIcsWndControl, OverbyteIcsFtpCli;
procedure TForm1.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;
if cn then
form1.memo1.Lines.add('FTP扫描成功!');
if not cn then
form1.memo1.Lines.add('FTP扫描失败!');
FtpClient1.free;
end;
ICS下的 TFtpClient 组件的 FtpClient1.Timeout 是起作用的,即使在网络断开或服务器失去响应的情况下, timeout 方法一样起作用。Internet Component Suite就是大名鼎鼎的ICS,免费提供ICS-SSL,提供SSL支持,支持代理,非堵塞式通讯。
官方网站:http://www.overbyte.be
最新版本:[ Download ICS-V7 Distribution (Sep 12, 2009) ], Support all Delphi 7-2010 and BCB version 2006-2010, ICS-SSL included for free.
直接下载地址:http://www.overbyte.be/arch/OverbyteIcsV7.zip
ICS的安装方法:
下载完成后解压到delphi的 lib目录(注,使用的是delphi2007)!
1、在Tools > Options > Delphi Options > library win32 > library path 里加入 $(BDS)\Lib\OverbyteIcsV7\Delphi\Vc32 目录。
2、打开 lib\OverbyteIcsV7\Delphi\Vc32 下的 OverbyteIcsD2007Design.dproj 文件。(文件名在其它Delphi版本略有不同)
3、在项目管理器中,右键 OverbyteIcsD2007Design.dproj 选择Build和Install,就安装完成了!
相关文章推荐
- 解决HttpURLConnection setConnectTimeout超时无响应的问题
- 解决HttpURLConnection setConnectTimeout超时无响应的问题
- 解决HttpURLConnection setConnectTimeout超时无响应的问题
- [delphi]indy idhttp post方法
- ftpClient的连接超时设置(setConnectTimeout,setSoTimeout)
- 使用 idHTTP 获取 UTF-8 编码的中文网页 - 回复同学 "Delphi学习者" 的问题
- [delphi]indy idhttp post方法
- 学习indy组件之一idhttp的使用方法
- 请教 indy 9 IDHTTP 的 IDHTTP.Connect(_CONN_TIME_OUT); 方法如何用
- Delphi IdHttp组件+IdHttpServer组件实现文件下载服务
- Delphi IdHttp组件+IdHttpServer组件实现文件下载服务
- 使用 idHTTP 获取 UTF-8 编码的中文网页 - 回复同学 "Delphi学习者" 的问题
- IDHTTP.CONNECT 随机问题
- c++ builder2010 indy控件idhttp, post页面获取数据(要注意编码的问题,双方都使用UTF-8最好)
- 用BCB的INDY组件中的IDHTTP 下载文件并显示出进度条
- ftpClient的连接超时设置(setConnectTimeout,setSoTimeout)
- http请求设置setConnectTimeout()方法超时无响应
- 关于Delphi 下indy Telnet 组件生成com的问题
- IdHTTP.post超时导致整个线程停止问题解决
- 百万数据修改索引或主键的超时问题(Timeout)