在互连网广泛应用的今天将有用的信息下载到本地是一件很普遍的事当然这个过程我们可以通过许多下载工具实现目前的这些下载工具绝大多数都是使用http协议完成的虽然使用http编写下载工具是一种很简单的方法但美中不足的是开发人员必须要结合winsock并编写大量的代码才可以完成因为http是一个工业标准你不可以自定义这个标准唯一的办法只有服从而且由于用到winsock技术所以对开发人员的要求也很高
以前我曾经用vb编写了一个下载程序在程序中使用了vb中提供的winsock activeX控件和http协议来实现最简单的下载功能这个程序的长度有行
今天当我翻框架时我兴奋了应为要编写一个下载软件比以前方便快捷了于是我忍不住希望有人和我分享这种愉悦的心情我真的是叫好他能使你从乏味的工作中解脱出来!
下面就让我们一下这种技术为什么如此让人兴奋
中编写快速简单的下载和上传的代码只要调用WebClient类就可以了对于简单请求和响应事务WebClient类提供将数据上载到Internet服务器或从Internet服务器下载数据的最简便的方法WebClient提供上载和下载文件发送和接收流以及将数据缓沖区发送到服务器并接收响应的方法这样事情就简单多了
了解了这个技术后我们就可以编写下载和上传的程序了
先添加timertextboxbuttonsavefiledialog和个label控件savefiledialog用来保存下载的文件timen用来和一个label控件结合显示已经下载了多少Textbox用来接受输入的url地址将timer的属性interval定为即每一秒启动一次Timer_Tick事件将labeltext定为http\\
代码如下
Imports SystemNet到入命名空间
Public Class Form
Inherits SystemWindowsFormsForm
Public Shared fpath As String
Dim fsize As Long
Private Sub Button_Click(ByVal sender As SystemObject ByVal e As
SystemEventArgs) Handles ButtonClick
Dim urld As String
Dim i As Integer
Dim dfile As New WebClient()实例化WebClient类
SaveFileDialogShowDialog()
fpath = SaveFileDialogFileName
LabelText = 文件保存在 ; fpath
urld = LabelText + TextBoxText
TimerEnabled = True
dfileDownloadFile(urld fpath)下载指定nrl地址的文件
TimerEnabled = False
End Sub
Private Sub Timer_Tick(ByVal sender As Object
ByVal e As SystemEventArgs) Handles TimerTick
MeRefresh()用来刷新窗口
Dim th As New th()
Dim tt As New SystemThreadingThread(AddressOf thtimeth) 实例化线程类
ttStart()启动线程
LabelText = thdownk显示下载文件的大小
进行计算下载速度
Static k As Integer
Dim pdownspeed
p = k
k = p +
p = k
Dim fileinfo As New SystemIOFileInfo(formfpath)
downspeed = fileinfoLength()
downspeed= downspeed/p
labeltextbox= 当前下载速度是; downspeed ; k/m
End Sub
End Class
Public Class th
Public Shared downk As String
Dim form As New Form()
Dim fileinfo As New SystemIOFileInfo(formfpath)
Dim fsize As Long
Public Sub timeth()
If fileinfoExists = True Then
fsize = fileinfoLength()
downk = 以下载文件 ; fsize ; k
End If
End Sub
End Class
你看懂上面的代码了吗?别急让我来解释一下
● 第一个要解释的是线程简单的说就是在exe文件运行的时候计算机会为他创建一个进程将这个进程分成若个块每块完成不同的任务这些块就是线程(更多的知识请见相关照料)那为什么我会在Timer_Tick事件(每过一段时间就执行其中的代码)中使用线程尼?因为我发现在调试的时候WebClient类占有的资源校大(这可能是net自己的原因)在运行时使整个窗口的显示不完整使用了线程和MeRefresh()语句后情况有所好转(在net中要创建线程的方法见msdn)
● 另一个要解释的是SystemIO框架中的FileInfo类我用他来读已经下载的文件大小在程序中我没有获取要下载文件的大小换句话说就是只有等下载完成后才可以知道文件到底用多大这时您或许要问难道net中没提供相关的类吗?我花了个小时将net中的所有类打开一一查看终于找了到相关的类这两个类就是WebRequest和WebResponse(这两个类的使用见msdn)即它们的子代类因为这两个类的使用比WebClient复杂(如果你要写更复杂的下载程序就要使用它们)但是如果你要获得服务器上你要下载的文件的大小你就必须使用它们下面我就写一个简单的代码来获得其服务器上你要下载的文件的大小
Private Sub Form_Click(ByVal sender As Object
ByVal e As SystemEventArgs) Handles MyBaseClick
Dim th As WebRequest =
WebRequestCreate(()exe)
这个站是超星的网站SSRbB()exe文件是超星图书阅读器
Dim w As WebResponse = thGetResponse()
Dim j As Long
j = wContentLength()ToString获得文件大小
DebugWriteLine(j)
End Sub
● 对于无法获得的下载速度我们可以通过计算来获得计算的思路是通过定义一个静态变量使他每一秒加一就可以知道下载了多少秒在从downspeed = fileinfoLength()语句得到下载的这段时间文件的大小用downspeed除以秒就可以得到当前的下载速度了请注意这只是一个估略的值如果你想每隔n秒才计算的话设置p=k* timerinterval/
● 最后要说的是你还可以调用winintedll这个动态库中的函数这个库是专为编写网络程序提供的使用它你也可以编写下载和上传的程序当然你也可以使用http来写
在结束前向大家推荐一本用vb和协议开发的书《visual basic 网络高级编程》是人民邮电出版社出的isbn号是/tp元汪晓平钟军写的这本书详细讲了用vb和httpftpsmtpnntptelnt协议开发网络程序的知识
看了以上的代码你是否觉得编写下载软件以不是什么高手才可以完成的任务了吧!那就动手吧!