Delphi使用Indy、ICS组件读取网页

使用Indy 10中TIdHTTP的例子:

ExpandedBlockStart.gif 代码
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的例子:

 ExpandedBlockStart.gif代码

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()取消连接的方式控制超时,也可以显式调用异步方法:

ExpandedBlockStart.gif 代码
var
  HttpClient: THttpCli;
  DataLen: Int64;
  FailMsg: 
string ;
  Tick: Cardinal;
begin
  .
  .
  .
  Tick :
=  GetTickCount;
  
try
    
try
      HttpClient.GetASync;
      
while  HttpClient.State  <>  httpReady  do
      
begin
        
if  GetTickCount  -  Tick  >   30 * 1000   then
        
begin
          HttpClient.Abort;
          Exit;
        
end ;
        Application.ProcessMessages;
      
end ;
  .
  .
  .

 


转载于:https://www.cnblogs.com/ddgg/archive/2010/08/25/1808058.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值