在互連網廣泛應用的今天
將有用的信息下載到本地是一件很普遍的事
當然
這個過程我們可以通過許多下載工具實現
目前的這些下載工具
絕大多數都是使用http協議完成的
雖然使用http編寫下載工具是一種很簡單的方法
但美中不足的是開發人員必須要結合winsock並編寫大量的代碼才可以完成
因為http是一個工業標准
你不可以自定義這個標准
唯一的辦法只有服從
而且由於用到winsock技術
所以對開發人員的要求也很高
以前我曾經用vb
編寫了一個下載程序
在程序中使用了vb
中提供的winsock activeX控件和http協議來實現最簡單的下載功能
這個程序的長度有
行
今天當我翻框架時
我興奮了
應為要編寫一個下載軟件比以前方便
快捷了
於是我忍不住希望有人和我分享這種愉悅的心情
我真的是叫好
他能使你從乏味的工作中解脫出來!
下面就讓我們一下這種技術為什麼如此讓人興奮
中編寫快速簡單的下載和上傳的代碼只要調用WebClient類就可以了
對於簡單請求和響應事務
WebClient類提供將數據上載到Internet服務器或從Internet服務器下載數據的最簡便的方法
WebClient提供上載和下載文件
發送和接收流以及將數據緩沖區發送到服務器並接收響應的方法
這樣
事情就簡單多了
了解了這個技術後
我們就可以編寫下載和上傳的程序了
先添加timer
textbox
button
savefiledialog和
個label控件
savefiledialog用來保存下載的文件
timen用來和一個label控件結合
顯示已經下載了多少
Textbox用來接受輸入的url地址
將timer
的屬性interval定為
即每一秒啟動一次Timer
_Tick事件
將label
text定為http
\\
代碼如下 Imports System
Net
到入命名空間
Public Class Form
Inherits System
Windows
Forms
Form
Public Shared fpath As String
Dim fsize As Long
Private Sub Button
_Click(ByVal sender As System
Object
ByVal e As
System
EventArgs) Handles Button
Click
Dim urld As String
Dim i As Integer
Dim dfile As New WebClient()
實例化WebClient類
SaveFileDialog
ShowDialog()
fpath = SaveFileDialog
FileName
Label
Text =
文件保存在
; fpath
urld = Label
Text + TextBox
Text
Timer
Enabled = True
dfile
DownloadFile(urld
fpath)
下載指定nrl地址的文件
Timer
Enabled = False
End Sub
Private Sub Timer
_Tick(ByVal sender As Object
ByVal e As System
EventArgs) Handles Timer
Tick
Me
Refresh()
用來刷新窗口
Dim th
As New th
()
Dim tt As New System
Threading
Thread(AddressOf th
timeth) 實例化線程類
tt
Start()
啟動線程
Label
Text = th
downk
顯示下載文件的大小
進行計算下載速度
Static k As Integer
Dim p
downspeed
p = k
k = p +
p = k
Dim fileinfo As New System
IO
FileInfo(form
fpath)
downspeed = fileinfo
Length()
downspeed= downspeed/p
label
textbox=
當前下載速度是
; downspeed
;
k/m
End Sub
End Class
Public Class th
Public Shared downk As String
Dim form As New Form
()
Dim fileinfo As New System
IO
FileInfo(form
fpath)
Dim fsize As Long
Public Sub timeth()
If fileinfo
Exists = True Then
fsize = fileinfo
Length()
downk =
以下載文件
; fsize
;
k
End If
End Sub
End Class
你看懂上面的代碼了嗎?別急
讓我來解釋一下
● 第一個要解釋的是線程
簡單的說就是在exe文件運行的時候計算機會為他創建一個進程
將這個進程分成若個塊
每塊完成不同的任務
這些塊就是線程(更多的知識請見相關照料)
那為什麼我會在Timer
_Tick事件(每過一段時間就執行其中的代碼)中使用線程尼?因為我發現在調試的時候WebClient類占有的資源校大(這可能是net自己的原因)
在運行時使整個窗口的顯示不完整
使用了線程和Me
Refresh()語句後情況有所好轉(在net中要創建線程的方法見msdn)
● 另一個要解釋的是System
IO框架中的FileInfo類
我用他來讀已經下載的文件大小
在程序中我沒有獲取要下載文件的大小
換句話說就是只有等下載完成後才可以知道文件到底用多大
這時您或許要問
難道net中沒提供相關的類嗎?我花了
個小時
將net中的所有類打開
一一查看
終於找了到相關的類
這兩個類就是WebRequest和WebResponse(這兩個類的使用見msdn)
即它們的子代類因為這兩個類的使用比WebClient復雜(如果你要寫更復雜的下載程序就要使用它們)但是如果你要獲得服務器上你要下載的文件的大小
你就必須使用它們
下面我就寫一個簡單的代碼
來獲得其服務器上你要下載的文件的大小
Private Sub Form
_Click(ByVal sender As Object
ByVal e As System
EventArgs) Handles MyBase
Click
Dim th As WebRequest =
WebRequest
Create(
(
)
exe
)
這個站是超星的網站
SSR
b
B(
)
exe文件是超星圖書閱讀器
Dim w As WebResponse = th
GetResponse()
Dim j As Long
j = w
ContentLength()
ToString
獲得文件大小
Debug
WriteLine(j)
End Sub
● 對於無法獲得的下載速度
我們可以通過計算來獲得
計算的思路是
通過定義一個靜態變量
使他每一秒加一
就可以知道下載了多少秒
在從downspeed = fileinfo
Length()語句得到下載的這段時間文件的大小
用downspeed除以秒就可以得到當前的下載速度了
請注意這只是一個估略的值
如果你想每隔n秒才計算的話
設置p=k* timer
interval/
● 最後要說的是
你還可以調用wininte
dll這個動態庫中的函數
這個庫是專為編寫網絡程序提供的
使用它你也可以編寫下載和上傳的程序
當然你也可以使用http來寫
在結束前向大家推薦一本用vb和協議開發的書
《visual basic 網絡高級編程》是人民郵電出版社出的
isbn號是
/tp
元汪曉平
鐘軍寫的
這本書詳細講了用vb和http
ftp
smtp
nntp
telnt協議開發網絡程序的知識
看了以上的代碼你是否覺得編寫下載軟件以不是什麼高手才可以完成的任務了吧!那就動手吧!
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25638.html