Delphi使用Indy、ICS组件读取网页
2013-10-29 20:03
465 查看
使用Indy 10中TIdHTTP的例子:
Indy采用的是同步I/O的方式,而且在连接超时控制方面存在bug,因此TIdHttp.Get()有时会发生陷入死锁无法返回的问题。
使用ICS中THttpCli的例子:
ICS使用的是异步I/O,其TFtpClient组件有Timout属性可以对连接超时进行控制,而THttpCli组件没有。但可以采用在定时器中调用THttpCli.Abort()取消连接的方式控制超时,也可以显式调用异步方法:
代码 uses IdHttp; . . . function HttpGet(const Url: string; var Html: string): Boolean; var HttpClient: TIdHTTP; begin Result := False; HttpClient := TIdHTTP.Create(nil); try Html := HttpClient.Get(Url); Result := True; except on e: Exception do begin end; end; HttpClient.Free; end;
Indy采用的是同步I/O的方式,而且在连接超时控制方面存在bug,因此TIdHttp.Get()有时会发生陷入死锁无法返回的问题。
使用ICS中THttpCli的例子:
uses HttpProt; . . . function HttpGet(const Url: string; var Html: string): Boolean; var HttpClient: THttpCli; DataLen: Int64; FailMsg: string; begin Result := False; HttpClient := THttpCli.Create(nil); HttpClient.URL := Url; HttpClient.NoCache := True; HttpClient.RcvdStream := TMemoryStream.Create; try try HttpClient.Get; DataLen := HttpClient.RcvdStream.Size; SetLength(Html, DataLen); HttpClient.RcvdStream.Position := 0; HttpClient.RcvdStream.Read(PChar(Html)^, DataLen); Result := True; except on E: EHttpException do begin FailMsg := Format('Failed : %d %s', [HttpClient.StatusCode, HttpClient.ReasonPhrase]); end else raise; end; finally HttpClient.RcvdStream.Free; HttpClient.RcvdStream := nil; HttpClient.Free; end; end;
ICS使用的是异步I/O,其TFtpClient组件有Timout属性可以对连接超时进行控制,而THttpCli组件没有。但可以采用在定时器中调用THttpCli.Abort()取消连接的方式控制超时,也可以显式调用异步方法:
var HttpClient: THttpCli; DataLen: Int64; FailMsg: string; Tick: Cardinal; begin Result := False; HttpClient := THttpCli.Create(nil); HttpClient.URL := Url; HttpClient.NoCache := True; HttpClient.RcvdStream := TMemoryStream.Create; Tick := GetTickCount; try try HttpClient.GetASync; while HttpClient.State <> httpReady do //检测HTTP状态 begin if GetTickCount - Tick > 30*1000 then //此处设置了30S超时,可根据需要修改此数值 begin HttpClient.Abort; Exit; end; Application.ProcessMessages; end; DataLen := HttpClient.RcvdStream.Size; SetLength(Html, DataLen); HttpClient.RcvdStream.Position := 0; HttpClient.RcvdStream.Read(PChar(Html)^, DataLen); Result := True; except on E: EHttpException do begin FailMsg := Format('Failed : %d %s', [HttpClient.StatusCode, HttpClient.ReasonPhrase]); end else raise; end; finally HttpClient.RcvdStream.Free; HttpClient.RcvdStream := nil; HttpClient.Free; end; end
相关文章推荐
- Delphi使用Indy、ICS组件读取网页
- Delphi使用Indy、ICS组件读取网页
- Delphi使用Indy、ICS组件读取网页
- 在.net中使用xmlhttp组件读取网页源码
- Delphi组件indy 10中IdTCPServer修正及SSL使用心得
- 在.net中使用xmlhttp组件读取网页源码
- Delphi组件indy 10中IdTCPServer修正及SSL使用心得
- 在.net中使用xmlhttp组件读取网页源码
- Delphi组件indy 10中IdTCPServer修正及SSL使用心得
- C#使用Gzip解压缩完整读取网页内容
- TWebBrowser组件在DELPHI中POST数据和取得网页源文件
- DELPHI读取网页源文件和获取字符串
- 微信小程序例子——使用progress组件实现读取进度效果
- Delphi XE5使用GPIP读取图片长宽和分辨率
- ASP.NET使用HttpWebRequest读取远程网页源代码
- DELPHI读取网页源文件和获取字符串
- 使用TWebBrowser组件保存网页为html和mht文件
- WebBrowser组件和MSHTML 在Delphi中的使用
- 能不能使用Ext中的GridPanel读取网页中Gridview的数据?
- 用 Delphi 7 创建 ActiveX 组件交 ASP 使用