gpt4 book ai didi

Delphi-使用套接字从网络下载文件

转载 作者:可可西里 更新时间:2023-11-01 16:05:19 25 4
gpt4 key购买 nike

我已经尝试过 Synapse、Indy 和 ICS,但我对它们并不满意。我想同时下载多个部分的多个文件,支持恢复、gzip 编码文件、cookie、使用 POST 登录网站等。所以我想我只会用套接字写入。但我看到在 Delphi 中有大量可用的套接字:TTcpClient、TRAwSocket、TCGIRequest、TClientSocket 等等。它们的文档都很糟糕——很难找到使用示例。我尝试使用 TTcpClient 但有时程序会卡住然后超时,我不知道为什么。在等待响应时看起来像个问题。这肯定不是服务器问题,因为我在本地主机上测试。用于 HTTP 协议(protocol)的最佳套接字是什么?有什么好用的吗?

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

我正在考虑类似的事情:

1) 做我想做的事——在同一个文件中下载多个带有进度条的文件

2) 类似 telnet 的东西 - 所以我只需将 HTTP 命令写成字符串,然后得到字节数组作为返回,我可以将其转换为字符串或保存到 tstream 中。

最佳答案

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

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

TIdHTTP 支持 cookie。您可以将 TIdCookieManager 组件分配给 TIdHTTP.CookieManager 属性,也可以不分配它,TIdHTTP 将创建一个 TIdCookieManager 内部对象。无论哪种方式,还要将 TIdHTTP.AllowCookies 属性设置为 True。

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

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

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

Indy 10 中的

TIdHTTP 支持 gzip 文件和 deflate 压缩文件(Iny 9 及更早版本中的 TIdHTTP 不支持压缩)。您可以将 TIdZLibCompressorBase 派生的组件(例如 TIdCompressorZLib)分配给 TIdHTTP.Compressor 属性,并且 TIdHTTP将为您处理所有细节,包括发送适当的 Accept-Encoding 请求 header ,以及检查服务器的 Transfer-Encoding 响应 header 。

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

关于Delphi-使用套接字从网络下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com