[英]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.ContentRangeStart
和TIdHTTP.Request.ContentRangeEnd
屬性設置為所需的字節。 要同時下載資源的多個部分,只需並行運行多個線程,每個線程都有自己的TIdHTTP
組件。 然后,您必須先將多個部分下載到單獨的臨時文件中,然后在完成時將它們合並到最終文件中,或者創建一個預先調整大小的文件,然后在TIdHTTP
所需的起始偏移處打開多個TFileStream
對象。寫給。
TIdHTTP
支持cookie。 您可以將TIdCookieManager
組件分配給TIdHTTP.CookieManager
屬性,也可以將其保留為未分配狀態, TIdHTTP
將在內部創建TIdCookieManager
對象。 無論哪種方式,還將TIdHTTP.AllowCookies
屬性設置為True。
網站登錄可以通過兩種不同的方式完成,具體取決於服務器是使用基於HTTP的身份驗證還是基於WebForm的身份驗證:
對於HTTP認證,加入所需IdAuthentication...
單位的uses
條款,如IdAuthentacationDigest
和IdAuthenticationNTLM
,或IdAllAuthentications
UNT,登記個人認證班, TIdHTTP
,然后設置TIdHTTP.Request.UserName
和TIdHTTP.Request.Password
性質如所須。 如果WebServer在請求期間請求身份驗證, TIdHTTP
將選擇適當的類並使用它以指定的憑據登錄。 如果服務器拒絕憑據,則會觸發TIdHTTP.OnAuthorization
事件,以便您有機會更改憑據TIdHTTP.OnAuthorization
試。
對於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
具有OnWorkBegin
, OnWork
和OnWorkEnd
事件,可用於進度條等。 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.