基于HTTP协议用WinSock实现任意文件下载
wget 常用示例

wget 常用示例让我们花点时间来了解一下wget命令!wget是一个非常强大且广泛使用的命令行工具,它主要用于从Web服务器上下载文件。
它支持HTTP、HTTPS和FTP等协议,能够在终端中执行,并带有许多可用选项和参数来满足各种需求。
在本文中,我们将一步一步地回答关于wget 的常用示例。
首先,让我们来了解一下wget的基本用法。
在终端中,只需键入"wget"后接URL,即可下载文件。
让我们尝试下载一个文件,并说明需要注意的事项。
示例1:下载一个文件wget在这个例子中,我们使用wget下载了一个名为"file.txt"的文件。
请确保替换URL为实际的文件URL。
接下来,让我们看看wget的一些常用选项和参数。
示例2:限速下载wget limit-rate=200k通过使用"limit-rate"选项,我们限制了下载速度为每秒200KB。
这对于避免网络拥塞或与其他应用程序共享带宽时非常有用。
示例3:下载到指定目录wget -P /path/to/directory通过使用"-P"选项,我们可以将下载的文件保存到指定的目录中。
请确保替换"/path/to/directory"为实际的目录路径。
示例4:重命名下载的文件wget -O newfile.txt使用"-O"选项,我们可以将下载的文件重命名为"newfile.txt"。
这对于避免文件名冲突或更改下载文件的名称非常有用。
示例5:断点续传wget -c通过使用"-c"选项,如果下载意外中断,我们可以恢复未完成的下载。
这对于大型文件或网络连接不稳定的情况非常有用。
示例6:后台下载wget -b使用"-b"选项,我们可以将下载作业放入后台运行。
这意味着您可以继续使用终端窗口而不会被下载进程干扰。
基于SOCKET的多线程下载工具的开发

2011年8月第8期电子测试ELECTRONIC TESTAug.2011No.8基于SOCKET的多线程下载工具的开发周学威,闫鑫,赵榉云,杨薇(中北大学 仪器科学与动态测试教育部重点实验室,山西 太原 030051)摘要:在Windows编程中,为了提高代码的时、空效率,广泛采取多线程技术。
本文以多线程技术的应用为研究背景,实现了多线程的一个应用:多线程文件下载。
该下载工具以VC++6.0为开发平台,利用Windows 套接字函数进行网络编程,实现了基于HTTP协议的文件下载过程,并通过创建和编写线程函数实现了文件的多线程下载工具的开发。
利用该下载工具可以对网上的文档、图片、歌曲等各种文件实现多线程下载。
经测试表明,该下载工具使文件的下载速率得到了有效提高。
关键词:多线程;HTTP协议;Windows套接字函数中图分类号: TN915.85 文献标识码: ADevelopment of multi-thread downlodeing toolbased on socketZhou Xuewei, Yan Xin, Zhao Juyun, Yang Wei(Key Laboratory of Instrumentation Science & Dynamic Measurement (North University of China),Ministry of Education, Taiyuan 030051, China)Abstract: In order to improve code’s efficiency both in time and space, Multi-thread technology widely used on Windows programs. This thesis’s background was the apply of the multithreading technology, realize an application of multithreading technology: The Multi-Thread download file . This tool used VC++6.0 as the development space and windows socket function to finish the process, realizing the file download based on Hyper Text Transfer Protocal, And by creating and writing thread function realize the file multi-thread downloading tools development.To avail these multithreading download instrument could download the different kinds of file by multithreading in net, such as the documents、pictures、songs and so on .The test shows that the download tools make file download speed effectively improved.Keywords: multi-thread; hyper text transfer protocal; Windows socket function0 引言多线程就是允许单个程序创建多个并行执行的线程来完成各自的任务,它在多任务和实时处理等方面具有重要意义,特别是在网络应用程序中,可以提高带宽利用率和程序反应速度[1]。
Java使用http协议将服务器图片下载到本地

JAVA使用http协议将服务器图片下载到本地1 服务器端新建java web项目该图片资源路径为http://localhost:8080/httppost/android.jpg2 客服端HttpUtils.java 代码如下:package com.zwh.http;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import .HttpURLConnection;import .URL;publicclass HttpUtils {privatestatic String URL_PATH ="http://localhost:8080/httppost/android.jpg";public HttpUtils() {// TODO Auto-generated constructor stub}publicstaticvoid saveToDisk() {// 获取输入流InputStreaminputStream = getInputStream();byte[] date = newbyte[1024];int len = 0;FileOutputStreamfileOutputStream = null;try {fileOutputStream =new FileOutputStream("F://example.jpg");while ((len = inputStream.read(date)) != -1) {fileOutputStream.write(date, 0, len);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (inputStream != null) {inputStream.close();}if (fileOutputStream != null) {fileOutputStream.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/*** @return*/publicstatic InputStream getInputStream() {InputStreaminputStream = null;HttpURLConnectionhttpURLConnection = null;try {URL url = new URL(URL_PATH);httpURLConnection = (HttpURLConnection) url.openConnection();// 设置连接网络的超时时间httpURLConnection.setConnectTimeout(3000);httpURLConnection.setDoInput(true);httpURLConnection.setRequestMethod("GET");int responseCode =httpURLConnection.getResponseCode();if (responseCode == 200) {inputStream = httpURLConnection.getInputStream();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return inputStream;}publicstaticvoid main(String[] args) {HttpUtilshttpUtils = new HttpUtils();httpUtils.saveToDisk();}}。
下载的原理

下载的原理
下载是指将远程主机上的文件或数据复制到本地计算机的过程。
下载的实现原理可分为以下几个步骤:
1. 建立网络连接:下载文件通常通过网络进行,首先需要建立与远程主机的网络连接。
本地计算机会通过网络协议(如HTTP、FTP等)与远程主机进行通信。
2. 发送下载请求:本地计算机向远程主机发送下载请求。
请求中包含要下载的文件的URL(统一资源定位符)等信息。
3. 远程主机响应:远程主机接收到下载请求后,会进行相应的处理。
远程主机会验证请求的合法性,并根据请求的信息查找要下载的文件。
4. 数据传输:一旦验证通过并找到了要下载的文件,远程主机会将文件的数据分割为多个数据包,并通过网络传输给本地计算机。
数据传输通常使用TCP/IP协议进行,确保数据的可靠
传输。
5. 接收数据:本地计算机接收到远程主机发送的数据包后,将其按照顺序组装成完整的文件。
同时,本地计算机会进行数据校验,以确保接收到的数据完整且没有错误。
6. 存储文件:完成数据接收后,本地计算机将文件存储到本地磁盘中的指定位置。
下载完成后,用户可以在本地访问和使用该文件。
需要注意的是,下载的实现原理可以因使用的网络协议或下载工具的不同而有所差异。
不同的协议和工具可能会有各自的特性和算法,但总体流程大致相似。
基于WINSOCK的FTP客户端的实现

基于Winsock的FTP客户端的实现目录一、课程设计基本要求 (2)课程设计目的 (2)课程设计任务 (2)课程设计要求 (2)二、程序简介 (2)开发环境 (2)程序界面 (3)三、原理概述 (4)FTP协议 (4)应用WinSock实现网络通信 (5)四、主要数据结构 (6)五、CFTPClient类 (8)控制连接的实现 (8)数据连接的实现 (11)六、体会 (13)一、课程设计基本要求●课程设计目的1 加深对TCP/IP协议的理解。
2 了解FTP协议的工作原理。
3 掌握用MFC编写FTP协议的实现程序。
●课程设计任务在Visual C++6.0的环境下实现FTP下载工具。
●课程设计要求1 了解FTP协议的工作原理。
(RFC765 , RFC2228, RFC2640, RFC2773)2 主要是基于TCP/IP的Winsock编程,用Visual C++6.0实现一个基于FTP协议的FTP下载工具(客户端)。
二、程序简介●开发环境操作系统:Microsoft Windows XP pro编译环境:Microsoft Visual C++ 6.0CPU:PM-1.7GHz内存:768MB硬盘:40MB分辨率:32bit 1024×768 程序界面三、原理概述FTP协议FTP是Internet上基于TCP/IP协议传输文件的应用层协议。
FTP规定了数据包的格式、数据包头部结构和命令结构等等。
FTP应用命令行方式传输文件。
FTP在RFC959中定义。
FTP应用TCP传输而不是UDP。
由FTP提供的文件传输是将一个完整的文件从一个系统复制到另一个系统中。
应用FTP首先需要登录FTP服务器,或者通过允许匿名FTP来使用FTP服务器。
FTP最早的设计是用于两台不同的主机即不同的操作系统下,不同的文件结构,不同的字符集。
FTP是建立两个TCP连接(见图) ,一个用于传输数据,另一个用于传输命令。
C#实现HTTP下载文件的方法

byte[] bArr = new byte[1024]; int size = responseStream.Read(bArr, 0, (int)bArr.Length); while (size > 0) {
stream.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, (int)bArr.Length); } stream.Close(); responseStream.Close(); return path; }
希望本文所述对大家的C#程序设计有所帮助。
// 设置参数 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//发送请求并获取相应回应数据 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 Stream responseStream = response.GetResponseStream();
这篇文章主要介绍了c播放铃声最简单实现方法通过调用系统方法实现播放wav格式音频文件的功能是非常实用的技巧需要的朋友可以参考下
C#实现 HTTP下载文件的方法
本文实例讲述了C#实现HTTP下载文件的方法。分享给大家供大家参考。
主要实现代码如下:
复制代码 代码如下: /// <summary> /// Http下载文件 /// </su
网络下载之简单任务HTTP和FTP下载介绍
网络下载之简单任务HTTP和FTP下载介绍 网络下载快速入门 下载是什么?对于刚刚接触网络的朋友来说,这还真是一个问题。
如果你搞不清楚下载是什么,那么你总知道Windows里面“复制/粘贴”是怎么回事吧——当我们需要复制一些资料时,可以使用“复制粘贴”命令得到原始材料的一份拷贝放到另外一个地方。
下载其实就是一种复制,他和普通的复制相比,唯一的区别就在于,我们不是在一台计算机内部进行复制而是在两台不同的(也许远隔万里)的计算机之间复制,之所以称其为“下”载,是因为从收取文件的一方来看,这些文件好像是从网络上“下”来的,故此得名。
随着技术的不断发展,下载的方式也是“江山代有才人出”了,从最初的FTP到现在的P2P,下载技术的突飞猛进绝对是互联网发展的一个缩影。
这中间有下载速度不断提升给用户带来欣喜,也有下载技术的发展而招来的“助长盗版”的指责,热闹的很!不管怎么说,时至今日,所有网民必须面对的一个现实是——上网,你就必须学会下载,如果你不会下载,或者下载玩得不够转,那么你干脆在自己胸前贴个牌子,写上“我不会上网”好了,不冤! 好,言归正传,目前用户使用较多的下载手段大致说来可以分成三大类,最常用(最传统)的HTTP和FTP下载,刚刚出现没多久然而已经风靡全球的P2P下载以及流媒体下载。
当然喽,饭得一口一口吃,让我们从最简单的FTP和HTTP下载方式说起。
HTTP和FTP下载 说点原理 HTTP和FTP是两种网络传输协议的缩写,FTP是File Transportation Protocol(文件传输协议)的缩写,而HTTP则是Hyper Text Transportation Protocol(超文本传输协议)的缩写,它们是计算机之间交换数据的方式,也是两种最经典的文件下载方式。
FTP专门用来下载,而HTTP的主要工作是用来浏览网页,不过也能用来下载。
这两种下载方式的原理并不复杂,就是用户按照一定的规则(协议)和提供文件的服务器取得联系并将文件搬到自己的计算机中来。
http下载 原理
http下载原理
http下载的原理是通过客户端和服务器之间的通信来传输文件。
以下是具体的步骤:
1. 客户端发送一个请求给服务器,请求的内容包括文件的
URL和其他相关信息。
2. 服务器接收到请求后,查找请求的文件并准备发送给客户端。
3. 服务器将文件进行分割,每个分割部分称为一个数据包。
4. 服务器将每个数据包按照顺序打包,并使用TCP/IP协议将
这些数据包发送给客户端。
5. 客户端接收到数据包后,将其进行存储。
6. 客户端发送一个确认收到的消息给服务器,以便服务器知道数据包已经被成功接收。
7. 如果文件还没有完全传输,服务器继续发送剩下的数据包。
8. 客户端重复步骤5~7,直到所有的数据包都被接收。
9. 客户端将所有接收到的数据包重新组装成完整的文件。
10. 下载完成后,客户端可以使用该文件进行相关操作,如保
存到本地或进行后续处理。
整个http下载的过程是基于客户端和服务器之间的请求和响应,使用TCP/IP协议进行数据传输。
通过文件的分割和数据
包的传输,实现了大文件的高效下载。
Http响应response(文件下载、验证码)
Http响应response(⽂件下载、验证码)Http响应responseresponse:响应作⽤: 往浏览器写东西组成部分: 响应⾏响应头响应体操作响应⾏格式: 协议/版本状态码状态码说明状态码:1xx:已发送请求2xx:已完成响应200:正常响应3xx:还需浏览器进⼀步操作302:重定向配合响应头:location304:读缓存4xx:⽤户操作错误404:⽤户操作错误.405:访问的⽅法不存在5xx:服务器错误500:内部异常常⽤⽅法:setStatus(int状态码):针对于 1xx 2xx 3xx了解 :sendError(int状态码):针对于 4xx和5xx操作响应头 格式: key:value(value可以是多个值)常⽤的⽅法:setHeader(String key,String value):设置字符串形式的响应头了解:setIntHeader(String key,int value):设值整形的响应头了解:setDateHeader(String key,long value):设值时间的响应头addHeader(String key,String value):添加字符串形式的响应头之前设置过则追加,若没有设置过则设置了解:addIntHeader(String key,int value):添加整形的响应头了解:addDateHeader(String key,long value):添加时间的响应头常⽤的响应头:location:重定向refresh:定时刷新content-type:设置⽂件的mime类型,设置响应流的编码及告诉浏览器⽤什么编码打开content-disposition:⽂件下载重定向:⽅式1:★response.sendRedirect("/day10/loc2");⽅式2:response.setStatus(302);respooen.setHeader("location","/day10/loc2");案例1:请求重定向web.xml⽂件配置<servlet><servlet-name>SHServlet1</servlet-name><servlet-class>com.hjh.request_response.SHServlet1</servlet-class></servlet><servlet-mapping><servlet-name>SHServlet1</servlet-name><url-pattern>/servlet1</url-pattern></servlet-mapping><servlet><servlet-name>SHServlet2</servlet-name><servlet-class>com.hjh.request_response.SHServlet2</servlet-class></servlet><servlet-mapping><servlet-name>SHServlet2</servlet-name><url-pattern>/servlet2</url-pattern></servlet-mapping>SHServlet1.java源码package com.hjh.request_response;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SHServlet1 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //重定向⽅式⼀//1.设置状态码response.setStatus(302);//2.设置响应头//response.setHeader("location", "/Servlet/servlet2");//重定向⽅式⼆:设置响应头response.sendRedirect("/Servlet/servlet2");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);}}SHServlet2.java源码:package com.hjh.request_response;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SHServlet2 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");response.getWriter().print("跳转到这⾥啦,哈哈哈");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);}}定时刷新:⽅案1:设置头 refreshrespooen.setHeader("refresh","秒数;url=跳转的路径");⽅案2:http的meta标签<meta http-equiv="refresh" content="3;url=/day10/refresh2.html">package com.hjh.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import er;import erService;public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.设置编码response.setContentType("text/html;charset=utf-8");//2.接收⽤户名和密码String username = request.getParameter("username");String password = request.getParameter("password");//3.调⽤UserService的login(username,password),返回⼀个user对象User user = new UserService().login(username,password);//4.判断user是否为空if(user==null) {//user为空response.getWriter().print("⽤户名和密码不匹配,3秒后跳转");//优化,定时跳转response.setHeader("refresh","3;url=/Servlet/login.html");}else {//user为不为空response.getWriter().print(user.getUsername()+":欢迎回来");}}}案例⼆:refresh1.html:<!DOCTYPE html><html><head><meta charset="UTF-8"><!--http-equiv:响应头content:响应体--><meta http-equiv="refresh" content="3;url=/Servlet/refresh2.html" ><title>注册页⾯</title></head><body>注册成功,<span id="sid">5</span>秒之后跳转到登录页⾯</body><script type="text/javascript">onload=function(){//设置定时器setInterval(changeS,1000);}i=5;function changeS(){//1.获取元素var obj = document.getElementById("sid");//2.操作元素的标签体obj.innerHTML=--i;}</script></html>refresh2.html:<!DOCTYPE html><html><head><meta charset="UTF-8"><title>登录页⾯</title></head><body>访问前,请先进⾏登录!</body></html>;页⾯上时间会⾃减,5秒后页⾯跳转到refresh2.html操作响应体:页⾯上要展⽰的内容常⽤⽅法:Writer getWriter():字符流ServletOutputStream getOutputStream() :字节流⾃⼰写的东西⽤字符流,其他⼀概⽤字节流.处理响应中⽂乱码:⽅式1:★response.setContentType("text/html;charset=utf-8");⽅式2:理解response.setHeader("content-type", "text/html;charset=utf-8");注意:两个流互斥。
网页下载的原理是啥
网页下载的原理是啥网页下载的原理是将服务器上的网页文件下载到用户的本地设备上,以便用户能够通过浏览器查看和操作网页内容。
下面将详细介绍网页下载的原理。
1. 用户输入URL:当用户在浏览器中输入一个网页地址(URL),浏览器会将该地址发送给服务器。
URL通过HTTP(Hypertext Transfer Protocol)或HTTPS(HTTP Secure)协议进行传输。
2. 域名解析:浏览器接收到URL后,需要将其中的域名解析为服务器的IP地址。
浏览器首先会查询本地DNS(Domain Name System)缓存,如果没有找到对应的IP地址,则会向DNS服务器发送域名解析请求。
3. 建立TCP连接:一旦得到了服务器的IP地址,浏览器就会根据该IP地址与服务器建立TCP (Transmission Control Protocol)连接。
TCP是一种可靠的传输协议,确保了数据的有序传输和可靠性。
4. 发起HTTP请求:连接建立后,浏览器会向服务器发起HTTP请求。
HTTP请求由请求方法、请求头和请求体组成。
常见的请求方法有GET、POST等,GET方法用于请求获取资源,而POST方法用于提交数据。
5. 服务器处理请求:服务器接收到浏览器发送的HTTP请求后,会根据请求的类型和参数进行相应的处理。
服务器会解析请求头中的信息,确定请求的资源类型和请求的处理方式。
6. 服务器返回响应:服务器处理完请求后,会向浏览器发送HTTP响应。
HTTP响应由响应状态码、响应头和响应体组成。
响应状态码用于表示请求的处理结果,常见的状态码有200表示成功,404表示资源未找到等。
7. 浏览器接收响应:浏览器接收到服务器发送的HTTP响应后,会对响应进行解析。
首先,浏览器会检查响应头中的内容,获取服务器返回的页面类型、编码方式等信息。
然后,浏览器会根据响应头中的内容类型确定如何处理响应体。
8. 页面渲染:如果响应的内容类型为HTML,浏览器会将HTML代码解析成DOM (Document Object Model)树,并根据CSS(Cascading Style Sheets)样式表对DOM树进行样式布局、渲染。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于HTTP协议用WinSock实现任意文件下载HTTP协议是文本格式通讯,下载文件是二进制数据,怎样处理好两种格式,而不受VB独断专行的Unicode转换影响,本代码提供了一个示例。
Option Explicit
Private strURL As String
Private mstrFileName As String, mlngFileNum As Long
Private mlngFileLen As Long, mlngCurByte As Long
Private mblnOnlyLen As Boolean, mblnPutStart As Boolean
Private Sub Form_Load()
strURL = Text1.Text '准备下载的文件URL
mstrFileName = Text2.Text '下载文件在本存放的位置与文件名Label1.Caption = "文件总字节:0"
Label2.Caption = "已下载字节:0"
Command1.Caption = "开始下载"
Command2.Caption = "取得长度"
End Sub
Private Sub Command1_Click()
mblnOnlyLen = False
DownFile
End Sub
Private Sub Command2_Click()
mblnOnlyLen = True
Label1.Caption = "文件总字节:0"
DownFile
End Sub
Private Sub DownFile()
mblnPutStart = False
Label2.Caption = "已下载字节:0"
Command1.Enabled = False
Command2.Enabled = False
With Winsock1
If .State <> sckClosed Then .Close
.Protocol = sckTCPProtocol
.RemoteHost = ""
.RemotePort = 80
.Connect
End With
End Sub
Private Sub Winsock1_Connect()
Dim s As String
s = "GET " + strURL + " HTTP/1.0" + vbCrLf
s = s + "Accept: */*" + vbCrLf
s = s & "Pragma: no-cache" & vbCrLf
s = s & "Cache-Control: no-cache" & vbCrLf
s = s & "Connection: close" & vbCrLf & vbCrLf
s = s + vbCrLf
Winsock1.SendData s
End Sub
Private Sub CloseAll()
If Winsock1.State <> sckClosed Then Winsock1.Close
Close #mlngFileNum
Command1.Enabled = True
Command2.Enabled = True
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim RevData() As Byte
Dim a() As Byte, b() As String, c() As String
Dim s As String, i As Long, k As Long
On Error GoTo fail
If mblnPutStart = False Then
Winsock1.PeekData RevData, vbArray Or vbByte
k = InStrB(1, RevData, ChrB(13) & ChrB(10) & ChrB(13) & ChrB(10))
If k > 0 Then
Winsock1.GetData RevData, vbArray Or vbByte
a = LeftB(RevData, k - 1)
RevData = MidB(RevData, k + 4)
s = StrConv(a, vbUnicode)
b = Split(s, vbCrLf)
If InStr(1, b(0), "200 OK", vbTextCompare) = 0 Then GoTo fail For i = 1 To UBound(b)
c = Split(b(i), ": ")
Select Case c(0)
Case "Content-Length"
mlngFileLen = CLng(c(1))
Label1.Caption = "文件总字节:" & mlngFileLen
If mblnOnlyLen Then
CloseAll
Exit Sub
End If
End Select
Next
mblnPutStart = True
mlngCurByte = UBound(RevData) + 1
mlngFileNum = FreeFile
Open mstrFileName For Binary As #mlngFileNum Else
Exit Sub
End If
Else
Winsock1.GetData RevData, vbArray Or vbByte
mlngCurByte = mlngCurByte + bytesTotal
End If
Put #mlngFileNum, , RevData
Label2.Caption = "已下载字节:" & mlngCurByte
If mlngCurByte = mlngFileLen Then
CloseAll
MsgBox "下载成功!"
End If
Exit Sub
fail:
CloseAll
MsgBox "网络传输错误,文件下载失败!"
End Sub。