4

我尝试过 Synapse、Indy 和 ICS,但我对它们并不满意。我想同时下载多个部分的多个文件,支持恢复、gzip 编码的文件、cookie、使用 POST 登录网站等。所以我想我会用套接字写。但我看到 Delphi 中有很多可用的套接字:TTcpClient、TRawSocket、TCGIRequest、TClientSocket 等等。它们都没有完整的文档记录——很难找到使用示例。我尝试使用 TTcpClient 但有时程序会冻结然后超时,我不知道为什么。等待回复时似乎有问题。这肯定不是服务器问题,因为我在 localhost 上进行了测试。用于 HTTP 协议的最佳套接字是什么?好用的东西?

我想在 Delphi 7 和 XE2 中都使用。我不想使用 WinAPI 之类的任何东西,所以我不必处理 PChars 和其他非 Delphi 的东西。

我正在考虑类似的事情:

1) 完全符合我的要求 - 在同一个文件中下载多个带有多个文件进度条的片段

或者

2)像telnet这样的东西——所以我只是把HTTP命令写成字符串,然后我得到字节数组作为回报,我可以转换成字符串或保存到tstreams。

4

1 回答 1

8

我无法评论其他库,但 Indy 支持您所要求的一切。

如果服务器支持,该TIdHTTP组件可以使用字节范围下载文件。您可以使用该TIdHTTP.Head()方法检查服务器是否返回Accept-Ranges: bytes给定 URL 的标头。如果是这样,那么您可以在从该 URL 下载数据时根据需要将TIdHTTP.Request.ContentRangeStartTIdHTTP.Request.ContentRangeEnd属性设置为所需的字节偏移量。要同时下载资源的多个部分,只需并行运行多个线程,每个线程都有自己的TIdHTTP组件。然后,您必须下载多个片段以分隔临时文件,然后在完成后将它们合并到最终文件中,或者创建一个预先确定大小的文件,然后TFileStream在所需的起始偏移量处打开多个对象以TIdHTTP写入.

TIdHTTP支持cookies。您可以将TIdCookieManager组件分配给TIdHTTP.CookieManager属性,也可以将其保留为未分配并在内部TIdHTTP创建一个TIdCookieManager对象。无论哪种方式,还要将该TIdHTTP.AllowCookies属性设置为 True。

网站登录可以通过两种不同的方式之一完成,具体取决于服务器是使用基于 HTTP 的身份验证还是基于 WebForm 的身份验证:

  1. 对于 HTTP 身份验证,将所需IdAuthentication...的单元添加到您的uses子句中,例如IdAuthentacationDigestandIdAuthenticationNTLMIdAllAuthenticationsunt,以使用 注册各个身份验证类TIdHTTP,然后根据需要设置TIdHTTP.Request.UserNameandTIdHTTP.Request.Password属性。如果 WebServer 在请求期间要求进行身份验证,TIdHTTP将选择适当的类并使用它使用指定的凭据登录。如果服务器拒绝凭据,TIdHTTP.OnAuthorization将触发该事件,让您有机会更改凭据并重试。

  2. 对于 WebForm 身份验证,有一个TIdMultipartFormDataStream类可以传递给TIdHTTP.Post()发布multipart/form-data格式化 POST 请求的方法。

TIdHTTP在 Indy 10 中支持 gzip 文件和 deflate 压缩文件(TIdHTTP在 Iny 9 和更早版本中不支持压缩)。您可以为该属性分配一个TIdZLibCompressorBase衍生组件,例如TIdCompressorZLib,并将为您处理所有细节,包括发送适当的请求标头和检查服务器的响应标头。TIdHTTP.CompressorTIdHTTPAccept-EncodingTransfer-Encoding

TIdHTTPhas OnWorkBegin, OnWork, 和OnWorkEnd可用于进度条等的事件。该OnWorkBegin事件有一个AWorkCountMax参数,如果已知,则指定要传输的字节总数,否则将为 0(使用Content-Length标头的 HTTP 响应将AWorkCountMax相应地设置,但使用Transfer-Encoding: chunked标头的 HTTP 响应不会)。该OnWork事件有一个AWorkCount参数,该参数指定到目前为止已传输了多少字节,而不管AWorkCounMax值如何。

于 2013-02-08T23:26:00.777 回答