簡體   English   中英

Delphi-使用套接字從Web下載文件

[英]Delphi- downloading files from the web with sockets

我嘗試過Synapse,Indy和ICS,我對它們並不滿意。 我想同時下載多個部分的多個文件,支持恢復,gzip編碼文件,cookie,使用POST登錄網站等等。 所以我想我會用套接字寫。 但我發現Delphi中有很多套接字:TTcpClient,TRawSocket,TCGIRequest,TClientSocket等等。 它們都記錄錯誤 - 很難找到用法示例。 我嘗試使用TTcpClient,但有時程序凍結,然后達到超時,我不知道為什么。 在等待回復時看起來像是一個問題。 這肯定不是服務器問題,因為我在localhost上測試。 使用HTTP協議的最佳套接字是什么? 容易使用的東西?

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

我想的是:

1)完全符合我的要求 - 在同一文件中使用許多文件的進度條下載多個部分

要么

2)像telnet這樣的東西 - 所以我只是把HTTP命令寫成字符串,我得到了返回的字節數組,我可以將其轉換為字符串或保存到tstream中。

我不能評論其他圖書館,但Indy支持你要求的一切。

如果服務器支持, TIdHTTP組件可以使用字節范圍下載文件。 您可以使用TIdHTTP.Head()方法檢查服務器是否返回給定URL的Accept-Ranges: bytes標頭。 如果是,則可以在從該URL下載數據時根據需要將TIdHTTP.Request.ContentRangeStartTIdHTTP.Request.ContentRangeEnd屬性設置為所需的字節。 要同時下載資源的多個部分,只需並行運行多個線程,每個線程都有自己的TIdHTTP組件。 然后,您必須先將多個部分下載到單獨的臨時文件中,然后在完成時將它們合並到最終文件中,或者創建一個預先調整大小的文件,然后在TIdHTTP所需的起始偏移處打開多個TFileStream對象。寫給。

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事件,以便您有機會更改憑據TIdHTTP.OnAuthorization試。

  2. 對於WebForm身份驗證,有一個TIdMultipartFormDataStream類,可以將其傳遞給TIdHTTP.Post()方法,以發布multipart/form-data格式的POST請求。

Indy 10中的TIdHTTP支持gzip文件和deflate壓縮文件( TIdHTTP 9及更早版本中的TIdHTTP不支持壓縮)。 您可以將TIdZLibCompressorBase派生的組件(例如TIdCompressorZLib分配給TIdHTTP.Compressor屬性, TIdHTTP將為您處理所有詳細信息,包括發送適當的Accept-Encoding請求標頭,以及檢查服務器的Transfer-Encoding響應標頭。

TIdHTTP具有OnWorkBeginOnWorkOnWorkEnd事件,可用於進度條等。 OnWorkBegin事件具有AWorkCountMax參數,該參數指定已知的傳輸的總字節數,否則它將為0(使用Content-Length標頭的HTTP響應將相應地設置AWorkCountMax ,但使用Transfer-Encoding: chunked HTTP響應Transfer-Encoding: chunked header不會)。 OnWork事件具有AWorkCount參數,該參數指定到目前為止已傳輸的字節數,與AWorkCounMax值無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM