网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Visual Basic
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.VisualBasic实现某一天的下/上一.
.VB技巧-文件操作的技巧.
.插入对象.
.VB网络篇游戏编程技巧指南.
.教你认识VB的座标系统.
.VBCOM基础讲座之测试ActiveXEXEs.
.不能再次装载程序.
.VisualBasic可以产生四角形以外其.
.变量的作用域与存活期.
.如何访问文本文件(1)----用Micro.
.关于VisualBasic6.0类开发(下).
.SQL的基本操作(3.表的相关操作).
.DirectX7.0使用心得(2).
.用VB6.0编写手机短信发送.
.通往Internet的捷径---捷径档的结.
.VB5.0中实现字体闪烁效果.
.VB从零开始编外挂(五).
.VB中调用Word拼写检查.
.用VB编写入侵监听程序(上).
.VisualBasic编程输入时,自动转换.

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

发表日期:2006-2-27


为了高效率地下载某站点的网页,我们可利用VB的InternetTransfer控件编写自己的下载程序,InternetTransfer控件支持超文本传输协议(HTTP)和文件传输协议(FTP),使用InternetTransfer控件可以通过OpenURL或Execute方法连接到任何使用这两个协议的站点并检索文件。本程序使用多个InternetTransfer控件,使其同时下载某站点。并可判断文件是否已下载过或下载过的文件是否比服务器上当前的文件陈旧,以决定是否重新下载。所有下载的文件中的链接都做了调整,以便于本地查阅。
OpenURL方法以同步方式传输数据。同步指的是传输操作未完成之前,不能执行其它过程。这样数据传输就必须在执行其它代码之前完成。
而Execute方法以异步方式传输数据。在调用Execute方法时,传输操作与其它过程无关。这样,在调用Execute方法后,在后台接收数据的同时可执行其它代码。
用OpenURL方法能够直接得到可保存到磁盘的数据流,或者直接在TextBox控件中阅览(如果数据是文本格式的)。而用Execute方法获取数据,则必须用StateChanged事件监视该控件的连接状态。当达到适当的状态时,调用GetChunk方法从控件的缓冲区获取数据。

首先,建立启始的http检索连接,
PublicgAsVariant
PublickAsVariant
PublicspathAsString
Dimlinks()AsString
g=0
spath=本地保存下载文件的路径
links(0)=启始URL
inet1.executelinks(0),"GET"'使用GET方法。

事件监控子程序(每个InternetTransfer控件设置相对应的事件监控子程序):
用StateChanged事件监视该控件的连接状态,当该请求已经完成,并且所有数据均已接收到时,调用GetChunk方法从控件的缓冲区获取数据。
PrivateSubInet1_StateChanged(ByValStateAsInteger)
'State=12时,使用GetChunk方法检索服务器的响应。
SelectCaseState
'...没有列举其它情况。

CaseicResponseCompleted'12
'获取links(g)中的协议、主机和路径名。
addsuf=Left(links(g),InStrRev(links(g),"/"))
'获取links(g)中的文件名。
fname=Right(links(g),Len(links(g))-InStrRev(links(g),"/"))
'判断是否是超文本文件,是超文本文件则分析其中的链接,若不是则存为二进制文件。
IfInStr(1,fname,"htm",vbTextCompare)=TrueThen
'初始化用于保存文件的FileSystemObject对象。
Setfs=CreateObject("Scripting.FileSystemObject")
DimvtDataAsVariant'数据变量。
DimstrDataAsString:strData=""
DimbDoneAsBoolean:bDone=False

'取得第一块。
vtData=inet1.GetChunk(1024,icString)
DoEvents
DoWhileNotbDone
strData=strData&vtData
DoEvents
'取得下一块。
vtData=inet1.GetChunk(1024,icString)
IfLen(vtData)=0Then
bDone=True
EndIf
Loop

'获取文档中的链接并置于数组中。
DimiAsVariant
Dimpo1AsVariant
Dimpo2AsVariant
DimorilAsString
DimnewlAsString
Dimlmtime,ctime
po1=InStr(1,strData,"href=",vbTextCompare) 5
po2=1
DimnewstrAsString:newstr=""
DimwhostrAsString:whostr=""
i=0
DoWhilepo1>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
Ifln<>""Then
'判定文件是否下载过。
Iffileexists(spath&newl)=FalseThen
links(i)=addsuf&ln
i=i 1
Else
lmtime=inet1.getheader("Last-modified")
Setf=fs.getfile(spath&newl)
ctime=f.datecreated
'判断文件是否更新
IfDateDiff("s",lmtime,ctime)<0Then
i=i 1
EndIf
EndIf
EndIf
po1=InStr(po2 1,strData,"href=",vbTextCompare) 5
Loop
newstr=Mid(strData,po2)
whostr=whostr newstr

Seta=fs.createtextfile(spath&fname,True)
a.Writewhostr
a.Close
k=i
Else
DimvtDataAsVariant
Dimb()AsByte
DimbDoneAsBoolean:bDone=False
vtData=Inet2.GetChunk(1024,icByteArray)
DoWhileNotbDone
b()=b()&vtData
vtData=Inet2.GetChunk(1024,icByteArray)
IfLen(vtData)=0Then
bDone=True
EndIf
Loop
Openspath&fnameForBinaryAccessWriteAs#1
Put#1,,b()
Close#1
EndIf
Calldevjob'调用线程调度子程序
EndSelect

EndSub

PrivateSubInet2_StateChanged(ByValStateAsInteger)
...
endsub

...

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

IfNotg 1<kThenGoToreportline
IfInet1.StillExecuting=FalseThen
g=g 1
Inet1.Executelinks(g),"GET"
EndIf
IfNotg 1<kThenGoToreportline
IfInet2.StillExecuting=FalseThen
g=g 1
Inet2.Executelinks(g),"GET"
EndIf

...

reportline:
IfInet1.StillExecuting=FalseAndInet2.StillExecuting=FalseAnd...Then
MsgBox("下载结束。")
EndIf
EndSub->

上一篇:用VB编写标准CGI程序(上) 人气:3461
下一篇:VB中远程共享显示及声音的实现 人气:4283
浏览全部Visual Basic的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐