Http協議的通信遵循一定的約定.例如,請求一個文件的時候先發送Get請求,然後服務器會返回請求的數據.如果需要進行斷點傳輸,那麼先發送HEAD /請求,其中返回的Content-Length: 就是文件實際大小.將其和我們本地需要斷點下載的文件大小比較,發送GET請求和發送需要下載的文件開始位置RANGE: bytes=+inttostr(iFilePos)+-+#13#10;服務器如果支持斷點下載的話就會接著發送余下的數據了.因為這方面的文章比較多,我在這裡就不詳細講述了.感興趣的朋友可以自行查閱相關資料或者RFC文檔。
當然,如果你是個懶人,也可以直接采用Delphi自帶的控件.以Delphi6的INDY組件為例.新建一個工程,放上一個TIdHTTP控件,一個TIdAntiFreeze控件,一個TProgressBar用於顯示下載進度.最後放上一個TButton用於開始執行我們的命令.代碼如下:
procedure TForm1.Button1Click(Sender: TObject);//點擊按鈕的時候開始下載我們的文件
var
MyStream:TMemoryStream;
begin
IdAntiFreeze1.OnlyWhenIdle:=False;//設置使程序有反應.
MyStream:=TMemoryStream.Create;
try
IdHTTP1.Get(http://www.138soft.com/download/Mp3ToExe.zip,MyStream);//下載我站點的一個ZIP文件
except//INDY控件一般要使用這種try..except結構.
Showmessage(網絡出錯!);
MyStream.Free;
Exit;
end;
MyStream.SaveToFile(c:\Mp3ToExe.zip);
MyStream.Free;
Showmessage(OK);
end;
procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);//開始下載前,將ProgressBar1的最大值設置為需要接收的數據大小.
begin
ProgressBar1.Max:=AWorkCountMax;
ProgressBar1.Min:=0;
ProgressBar1.Position:=0;
end;
procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);//接收數據的時候,進度將在ProgressBar1顯示出來.
begin
ProgressBar1.Position:=ProgressBar1.Position+AWorkCount;
end;
IdHTTP1的Get還有一種形式就是獲取字符串:例如,上面的程序可以改寫成:
procedure TForm1.Button1Click(Sender: TObject);
var
MyStr:String;
begin
IdAntiFreeze1.OnlyWhenIdle:=False;//設置使程序有反應.
try
MyStr:=IdHTTP1.Get(http://www.138soft.com/default.htm);
except
Showmessage(網絡出錯!);
Exit;
end;
Showmessage(MyStr);
end;
應用:現在很多程序都有自動升級功能,實際上就是應用了GET.先在自己站點放一個文本文件注明程序版本號,當檢查升級的時候,取文本內容與當前版本號比較,然後決定升級與否.