分享
 
 
 

用VB编写异步多线程下载程序

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

为了高效率地下载某站点的网页,我们可利用VB的Internet Transfer 控件编写自己的下载程序, Internet Transfer 控件支持超文本传输协议 (HTTP) 和文件传输协议 (FTP),使用 Internet Transfer 控件可以通过 OpenURL 或 Execute 方法连接到任何使用这两个协议的站点并检索文件。本程序使用多个Internet Transfer 控件,使其同时下载某站点。并可判断文件是否已下载过或下载过的文件是否比服务器上当前的文件陈旧,以决定是否重新下载。所有下载的文件中的链接都做了调整,以便于本地查阅。

OpenURL 方法以同步方式传输数据。同步指的是传输操作未完成之前,不能执行其它过程。这样数据传输就必须在执行其它代码之前完成。

而 Execute 方法以异步方式传输数据。在调用 Execute 方法时,传输操作与其它过程无关。这样,在调用 Execute 方法后,在后台接收数据的同时可执行其它代码。

用 OpenURL 方法能够直接得到可保存到磁盘的数据流,或者直接在 TextBox 控件中阅览(如果数据是文本格式的)。而用 Execute 方法获取数据,则必须用 StateChanged 事件监视该控件的连接状态。当达到适当的状态时,调用 GetChunk 方法从控件的缓冲区获取数据。

首先,建立启始的http检索连接,

Public g As Variant

Public k As Variant

Public spath As String

Dim links() As String

g = 0

spath = 本地保存下载文件的路径

links(0)=启始URL

inet1.execute links(0), "GET" 注释:使用GET方法。

事件监控子程序(每个Internet Transfer 控件设置相对应的事件监控子程序):

用StateChanged 事件监视该控件的连接状态, 当该请求已经完成,并且所有数据均已接收到时,调用 GetChunk 方法从控件的缓冲区获取数据。

Private Sub Inet1_StateChanged(ByVal State As Integer)

注释:State = 12 时,使用 GetChunk 方法检索服务器的响应。

Select Case State

注释:...没有列举其它情况。

Case icResponseCompleted 注释:12

注释:获取links(g)中的协议、主机和路径名。

addsuf = Left(links(g), InStrRev(links(g), "/"))

注释:获取links(g)中的文件名。

fname = Right(links(g), Len(links(g)) - InStrRev(links(g), "/"))

注释:判断是否是超文本文件,是超文本文件则分析其中的链接,若不是则存为二进制文件。

If InStr(1, fname, "htm", vbTextCompare) = True Then

注释:初始化用于保存文件的FileSystemObject对象。

Set fs = CreateObject("Scripting.FileSystemObject")

Dim vtData As Variant 注释:数据变量。

Dim strData As String: strData = ""

Dim bDone As Boolean: bDone = False

注释:取得第一块。

vtData = inet1.GetChunk(1024, icString)

DoEvents

Do While Not bDone

strData = strData & vtData

DoEvents

注释:取得下一块。

vtData = inet1.GetChunk(1024, icString)

If Len(vtData) = 0 Then

bDone = True

End If

Loop

注释:获取文档中的链接并置于数组中。

Dim i As Variant

Dim po1 As Variant

Dim po2 As Variant

Dim oril As String

Dim newl As String

Dim lmtime, ctime

po1 = InStr(1, strData, "href=", vbTextCompare) + 5

po2 = 1

Dim newstr As String: newstr = ""

Dim whostr As String: whostr = ""

i = 0

Do While po1 > 0

newstr = Mid(strData, po2, po1)

whostr = whostr + newstr

po2 = InStr(po1, strData, ">", vbTextCompare)

注释:将原链接改为新链接

oril = Mid(strData, po1 + 1, po2 - po1 - 1)

注释:如果有引号,去掉引号

ln = Replace(oril, """", "", vbTextCompare)

newl = Right(ln, Len(ln) - InStrRev(ln, "/"))

whostr = whostr & newl

If ln <> "" Then

注释:判定文件是否下载过。

If fileexists(spath & newl) = False Then

links(i) = addsuf & ln

i = i + 1

Else

lmtime = inet1.getheader("Last-modified")

Set f = fs.getfile(spath & newl)

ctime = f.datecreated

注释:判断文件是否更新

If DateDiff("s", lmtime, ctime) < 0 Then

i = i + 1

End If

End If

End If

po1 = InStr(po2 + 1, strData, "href=", vbTextCompare) + 5

Loop

newstr = Mid(strData, po2)

whostr = whostr + newstr

Set a = fs.createtextfile(spath & fname, True)

a.Write whostr

a.Close

k = i

Else

Dim vtData As Variant

Dim b() As Byte

Dim bDone As Boolean: bDone = False

vtData = Inet2.GetChunk(1024, icByteArray)

Do While Not bDone

b() = b() & vtData

vtData = Inet2.GetChunk(1024, icByteArray)

If Len(vtData) = 0 Then

bDone = True

End If

Loop

Open spath & fname For Binary Access Write As #1

Put #1, , b()

Close #1

End If

Call devjob 注释:调用线程调度子程序

End Select

End Sub

Private Sub Inet2_StateChanged(ByVal State As Integer)

...

end sub

...

线程调度子程序,g和是k公用变量,k为最后一个链接的数组索引加一,g初值为零,每次加一,直到处理完最后一个链接。

Private Sub devjob()

If Not g + 1 < k Then GoTo reportline

If Inet1.StillExecuting = False Then

g = g + 1

Inet1.Execute links(g), "GET"

End If

If Not g + 1 < k Then GoTo reportline

If Inet2.StillExecuting = False Then

g = g + 1

Inet2.Execute links(g), "GET"

End If

...

reportline:

If Inet1.StillExecuting = False And Inet2.StillExecuting = False And ... Then

MsgBox ("下载结束。")

End If

End Sub

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有