使用Indy 10中TIdHTTP的例子:

代码

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 := ;
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 > * then //此处设置了30S超时,可根据需要修改此数值

        begin

          HttpClient.Abort;

          Exit;

        end;

        Application.ProcessMessages;

      end;

      DataLen := HttpClient.RcvdStream.Size;

      SetLength(Html, DataLen);

      HttpClient.RcvdStream.Position := ;

      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组件读取网页的更多相关文章

  1. php 读取网页源码 , 导出成txt文件, 读取xls,读取文件夹下的所有文件的文件名

    <?php // 读取网页源码$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLO ...

  2. HttpWebRequest后台读取网页类

    using System;using System.Linq;using System.Collections.Generic;using System.Web;using System.Config ...

  3. C#读取网页源码

    #region 1.读取 网页源码 + static string ReadHtml(string urlStr,int type) /// <summary> /// 读取 网页源码 + ...

  4. 10-利用com组件读取office

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  5. Delphi中使用python脚本读取Excel数据

    Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  6. java读取网页图片路径并下载到本地

    java读取网页图片路径并下载到本地 最近公司需要爬取一些网页上的数据,自己就简单的写了一个demo,其中有一些数据是图片,需要下载下来到本地并且 将图片的路径保存到数据库,示例代码如下: packa ...

  7. 利用backgroundwork----递归读取网页源代码,并下载href链接中的文件

    今天闲着没事,研究了一下在线更新程序版本的问题.也是工作中的需要,开始不知道如何下手,各种百度也没有找到自己想要的,因为我的需求比较简单,所以就自己琢磨了一下.讲讲我的需求吧.自己在IIs上发布了一个 ...

  8. 组件化网页开发 / 步骤一 · 4-4 匹配HTML标签

    组件化网页开发 / 步骤一 · 4-4 匹配HTML标签

  9. 熟练使用jquery ui / easyui的各种组件设计网页界面

    熟练使用jquery ui / easyui的各种组件设计网页界面

随机推荐

  1. Windows7中pagefil.sys和Hiberfil.sys文件删除与转移

    第一步.在开始的功能表的搜索栏里输入 cmd,然后在搜索结果中的 cmd 按下右键,点选[以系统管理员身分运行] 第二步.在命令提示符窗口里输入下面命令然后按下Enter: powercfg –h o ...

  2. 线段树 - HDU1166 - 敌兵布阵

    2017-07-29 16:41:00 writer:pprp 线段树跟区间操作相关,想要在题目限定的时间内解决问题就需要用线段树这种数据结构来解决: 线段树是一种二叉平衡树 参考书目:张新华的< ...

  3. Codeforces Round #363 (Div. 2) A、B、C

    A. Launch of Collider time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  4. JSP数据交互(一)

    1.JSP内置对象 请求对象:request 输出对象:out 响应对象:response 应用程序对象:application 会话对象:session 页面上下文对象:pageContext 页面 ...

  5. scjp考试准备 - 10 - 类型转换

    题目为如下代码的执行结果: class Building{} public class Barn extends Building{ public static void main(String[] ...

  6. JavaScript tips —— 搞定闰年

    前言 处理时间时,常常要考虑用户的输入是否合法,其中一个很典型的场景就是平闰年的判断,网上其实有很多类似的算法,但是其实不必那么麻烦,下面我讲讲的我的思路. 规则 公元年数可被4整除为闰年,但是整百( ...

  7. JavaScript全屏显示

    JavaScript全屏显示 需要引入的库 https://cdn.bootcss.com/jquery/1.9.0/jquery.min.js https://cdn.bootcss.com/scr ...

  8. Android仿IOS底部弹出选择菜单ActionSheet

    使用Dialog的实现方式,解决原ActionSheet使用Fragment实现而出现的部分手机取消按钮被遮盖的问题 java部分代码: import android.app.Dialog; impo ...

  9. python学习笔记(arange函数与linspace函数)

    上一篇提及到matplotlib模块.其中会涉及到numpy模块科学计数 这里总结两个数组生成函数 arange 与 linspace: #!/usr/bin/env python # -*- cod ...

  10. 方便处理hosts的批处理脚本:hosts助手.bat

    hosts助手.bat @echo off pushd "%~dp0" set sp0=------------------ set sp1=hosts助手 set hostsfi ...