多线程下载Java 多线程下载程序项目

多线程下载  时间:2021-07-19  阅读:()

FTP的多线程下载如何实现?

现在有不少软件可实现多线程下载.如NetAnts,JetCar等,其实多线程下载的原理并不复杂,主要的两项技术就是多线程和断点下载。

程序中开启多个线程,每个线程利用断点下载,分别下载文件的不同部分,下载完后合并,就可以了。

多线程编程很多书已有介绍,这里不再重复,关于断点下载,MFC中提供的File类可实现HTTP的断点下载,但无法实现FTP的断点下载。

因此,我们只好从FTP协议中的命令入手,自己编写个FTP类,来实现多线程下载。

本人编写的CMultiFTP类(在WIN2000+IIS5。

0下测试成功)已在CSDN发表。

FTP指令的详细信息,大家可从.isi.edu/in-notes/rfc/处获得,这里给大家介绍下与多线程下载有关的几个指令极其格式: USER〈USERNAME〉:登陆FTP的用户名,执行成功返回220; PASS〈PASSWORD〉:密码,执行成功返回230; REST〈POS〉:指定文件下载的开始位置,执行成功返回350; SIZE〈FILENAME〉:文件大小,执行成功返回213; PASV:建立数据连接,同时取得FTP服务器下载文件时用的端口号,执行成功返回227; TYPE:指定下载文件的类型,参数为I是二进制文件,为A是字符文件,执行成功返回200; RETR〈FILENAME〉:下载文件,执行成功返回125; 这些命令中,REST,RETR,SIZE三个命令最关键,在后面会给大家更详细的说明,另外执行FTP命令,FTP服务器会向客户端返回一代码,命令执行成功的代码上面已给出。

向服务器发送命令,可把命令当作字符串向服务器发送,如:send(socket,”rest 100 ”,…)(注意:要在命令后加 )。

在介绍多线程下载前,先给大家介绍下连接FTP服务器和从FTP服务器下载文件的过程。

连接FTP SERVER很简单,创建一套接字,指定服务器的地址和端口号,连接到服务器,再向它发送USER和PASS命令,服务器返回230,就代表登陆成功,并且服务器和客户建立了一控制连接。

FTP服务器下载文件的过程比较复杂。

首先,客户端要和服务器建立一数据连接,可用PORT或PASV命令建立数据连接,PORT命令要自己指定一端口号用于下载,PASV命令则由服务器分配一端口号,客户端可从服务器的返回信息提取端口号,返回信息的格式为: (服务器IP,端口号),本人的程序将使用PASV命令。

然后向服务器发送RETR命令下载文件,或先发送一REST命令指明从哪下载文件。

之后,要建立一新的套接字,连接到数据连接指定的端口,文件数据就从这个套接字下载。

下载完毕后,关闭套接字。

现在进入本篇的精华,实现多线程下载。

执行完登陆操作后,先发送“REST 100”命令,测试下服务器是否支持断点下载,如返回成功代码,就可实现多线程下载;然后发送“SIZE”,取得文件的大小,根据文件大小,将文件分为几部分,记下各部分的偏移地址,并作为参数,交给各线程去下载。

在下载线程中,先接受主线程传给他的参数(文件名,偏移地址,保存地址等),再发送“PASV”命令,建立数据连接,并新建一套接字连接到新的端口;然后根据文件类型,二进制文件发送“TYPE I“命令,文本文件发送”TYPE A“命令;之后发送“REST 〈文件偏移地址〉”命令,通知服务器改变将要下载的文件的开始地址;最后,执行“RETR 〈文件名〉”命令,下载文件。

下载完毕后,编段代码合并文件即可。

在这里有个问题,就是主线程如何得知各下载线程已执行完毕。

WINDOWS提供了几种线程互斥技术,如CriticalSection,Mutex等,关于他们的详细信息,大家可参考各种编程书籍,在这里我推荐使用CriticalSection技术。

可以在程序中建立一全局计数器,在文件下载前置零,并建立一全局CriticalSection变量。

在下载线程中,当文件下载完毕后,先锁定全局CriticalSection变量,之后将计数器加一,再释放全局CriticalSection变量。

主线程中,可建立一定时,定期检查计数器的值,或让下载线程在下载完毕后调用主线程的某个函数。

这样,主线程就可随时发现文件已下载完毕,可合并文件了。

多线程下载的程序设计就是这样,一点都不难。

看来掌握某些计算机技术,特别是网络技术,最好还是从实现原理入手,掌握其最精华的部分,激发自己的灵感,编写出个优秀软件。

老停留在使用别人的组件和函数库的基础上,你的水平不会有太大提高。

什么叫 “下载线程”?

线程就是说连接数,比如说你下载某个东西有5条线程,就相当于从你电脑到装这东西的服务器之间有五条线在同时下载,每条线下载不同的部分,下载完了以后,再把它们组合在一起, 或者给你一个任务:把车上的货物卸下来,可以一个工人做,也可以五个工人做,那么一个工人就是一条线程

BT下载和多线程下载有什么区别,两这比较哪个的硬盘使用率更高?

有着根本的区别, 多线程是下载工具把服务器上的文件分成n个区域,同时下载。

bt则是与其他的客户端相连,互换有无。

至于硬盘的损耗,应该说是bt大一些,毕竟他是读写同时进行的。

不过学术界至今的讨论人文停止,大多数人认为数据读写不会 造成硬盘的损耗。

见仁见智吧,最好损害不大

如何让IE支持多线程下载?

?? 步骤1:单击“开始” “运行”命令,打开“运行”窗口,输入regedit命令,单击“确定”按钮,打开“注册表编辑器”窗口,如下图所示。

????步骤2:在左侧的窗格中,展开HKEY CURRENT_USERSofiwareMicrosoftWin-dowsCurrentVersion?Settings选项,如下图所示。

? ???? 步骤3:在窗口右侧的窗格中,选择MaxConnectionsPerServer选项,单击鼠标右键,在弹出的快捷菜单中选择“修改”选项.让IE支持多线程下载。

如下图所示。

????步骤4:弹出“编辑DWORD(32位)值”对话框,在“数值数据”下方的文本框中输入8,如下图所示。

????步骤5:单击“确定”按钮,返回到相应窗口,选择MaxConnectionsPerl?OServer选项,单击鼠标右键,在弹出的快捷菜单中选择“修改”选项,如下图所示。

Java 多线程下载程序项目

多线程下载文件,基本上要靠essFile这个类,该类可以随机读取文件,下面是我以前写的一个多线程复制文件的例子,希望对你能有帮助:

.ff;

import java.io.*; import ess;

public class Demo{ public static void main(String[] args) throws Exception{ File srcFile=new File("源文件路径"); File=new File("目标文件路径"); /File.createNewFile(); Demo demo=new Demo(); demo.analysisFile(File,4);//4为线程数,你也可以修改为其他数值 } public void analysisFile(File srcFile,File,int threadNum){ int length=(int)srcFile.length(); int splitNum=length%threadNum==0?length/threadNum:length/threadNum+1; int skipPostion=-1; int readNum=0; for(int i=1;i<=threadNum;i++){ if(i!=threadNum){ readNum=i*splitNum; } else{ readNum=length-readNum; }

new SplitFile(File,skipPostion+1,readNum).start(); skipPostion=i*splitNum; } } class SplitFile extends Thread{ private int minPosition; private int maxPosition; private File srcFile; private File; public SplitFile(File srcFile,File,int minPosition,int maxPosition){ this.maxPosition=maxPosition; this.minPosition=minPosition; this.srcFile=srcFile; File; } public void run(){ try{ essFile raf_r=new essFile(srcFile,"rw"); essFile raf_w=new File,"rw"); raf_r.skipBytes(minPosition); raf_w.seek(minPosition); byte[] buf=new byte[1]; int alreadyRec=0; for(int size=0;alreadyRec<=maxPosition&&size!=-1;size=raf_r.read(buf)){ alreadyRec+=size; raf_w.write(buf,0,size); } raf_w.close(); raf_r.close(); System.out.println("总共:"+srcFile.length()+" 文件"+srcFile.getName()+"从:"+minPosition+"开始---复制大小:"+maxPosition+"结束!此刻接收文件大小为:"File.length()); } catch(Exception ex){ ex.printStackTrace(); } } } }

Vultr VPS韩国首尔机房速度和综合性能参数测试

Vultr 商家有新增韩国首尔机房,这个是继日本、新加坡之后的第三个亚洲机房。不过可以大概率知道肯定不是直连中国机房的,因为早期的日本机房有过直连后来取消的。今天准备体验看看VULTR VPS主机商的韩国首尔机房的云服务器的速度和性能。1、全球节点PING速度测试这里先通过PING测试工具看看全球几十个节点的PING速度。看到好像移动速度还不错。2、路由去程测试测试看看VULTR韩国首尔机房的节点...

Advinservers:美国达拉斯便宜VPS/1核/4GB/80GB SSD/1Gbps不限流量/月付$2.5/美国10Gbps高防服务器/高达3.5TBDDos保护$149.99元/月

Advinservers,国外商家,公司位于新泽西州,似乎刚刚新成立不久,主要提供美国和欧洲地区VPS和独立服务器业务等。现在有几款产品优惠,高达7.5TB的存储VPS和高达3.5TBDDoS保护的美国纽约高防服务器,性价比非常不错,有兴趣的可以关注一下,并且支持Paypal付款。官方网站点击直达官方网站促销产品第一款VPS为预购,预计8月1日交付。CPU为英特尔至强 CPU(X 或 E5)。官方...

pacificrack:超级秒杀,VPS低至$7.2/年,美国洛杉矶VPS,1Gbps带宽

pacificrack又追加了3款特价便宜vps搞促销,而且是直接7折优惠(一次性),低至年付7.2美元。这是本月第3波便宜vps了。熟悉pacificrack的知道机房是QN的洛杉矶,接入1Gbps带宽,KVM虚拟,纯SSD RAID10,自带一个IPv4。官方网站:https://pacificrack.com支持PayPal、支付宝等方式付款7折秒杀优惠码:R3UWUYF01T内存CPUSS...

多线程下载为你推荐
智能加速加速器是干什么的?qq空间维护QQ空间正在维护中,暂不支持访问是怎么回事windows7正版验证如何在微软网站验证Win7系统是否正版的方法百度预测世界杯预测世界杯8强名单magento模板网站建好了,但是对模板不满意,有哪位亲知道怎么换模板吗?物联卡官网物联卡9.9元100g流量卡是真的吗dnf客户端消失DNF客户端无缘无故消失做视频的免费软件有没有免费做视频的软件 汉化的cf服务器爆满为什么穿越火线显示该服务器已爆满怎么才能挤进去?慕课网址慕课官网的电话多少?
香港vps99idc 香港服务器99idc 163网 wdcp 北京主机 老左正传 东莞数据中心 百度云1t 香港新世界中心 360云服务 web应用服务器 lamp怎么读 酸酸乳 阿里云邮箱个人版 木马检测 火山互联 神棍节 海尔t68驱动 瓦工招聘 堡垒主机 更多