- 浏览: 215638 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
andy1015:
请教下楼主rtx问题 ,可以么
用HttpClient实现同步RTX -
cgp17:
请教:Chukwa支持Push数据吗?目前看到的都是Polli ...
基于Hadoo的日志收集框架---Chukwa的源码分析(适配器、代理) -
jimmee:
尼玛, 现在iteye的质量下降到何种水准了.
Mahout协同过滤框架Taste的源码分析 -
aubdiy:
aubdiy 写道我擦。。。。 这你叫分析才看到, 还有个 “ ...
Mahout协同过滤框架Taste的源码分析 -
aubdiy:
我擦。。。。 这你叫分析
Mahout协同过滤框架Taste的源码分析
以多线程、断点续传方式下载文件,经常出现下载下来的文件大小和服务端一致,但是却无法正常打开的现象,搞了很久,贴下我的实现方式,请各位多多指教
思路:
1、将下载文件的处理放在自定义的线程类中,每下载一个文件就新启动一个下载线程。
2、在下载线程中完成对服务端的链接和身份认证,成功后开始下载文件。
3、新建n个子线程,根据下载文件的大小和线程数量得到每个子线程要下载的大小。
4、分别启动子线程,进行分段下载。
5、分段下载完成,合并临时文件。
6、合并文件完成,删除临时文件。
实现:
FTP下载线程类
package com.jfc.ftp.tools; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import com.jfc.ftp.service.FTPService; import com.jfc.ftp.util.Constant; import com.jfc.ftp.util.PropertyUtil; /** * 为断点续传下载文件而启动新的线程 * @author SavageGarden * */ public class FTPThread extends Thread{ /** * 站点URL */ private String host; /** * 站点端口 */ private int port; /** * 用户 */ private String user; /** * 密码 */ private String pswd; /** * 当前线程的FTP操作接口实现类 */ private FTPService ftpService; /** * 第几个下载项 */ private int rowIndex; /** * 要下载的文件路径 */ private String filepath; /** * 要下载的文件大小 */ private long filesize; /** * 要下载的文件保存路径 */ private String savepath; /** * 标记文件已下载量 */ public int hadRead = 0; /** * 下载线程开始时间 */ public long startTime = 0; /** * 下载线程结束时间 */ public long endTime = 0; /** * 当前下载线程的互斥锁 */ public Lock ftpThreadLock; /** * 当前下载线程的状态 */ private int status = Constant.THREAD_STATUS_NEW; public synchronized int getStatus() { return status; } public synchronized void setStatus(int status) { this.status = status; } /** * 是否已经合并文件 */ private boolean hadMerger = false; public synchronized boolean isHadMerger() { return hadMerger; } public synchronized void setHadMerger(boolean hadMerger) { this.hadMerger = hadMerger; } /** * 当前下载线程的状态 */ private int completed = 0; public synchronized int getCompleted() { return completed; } public synchronized void setCompleted(int completed) { this.completed = completed; } /** * 下载线程个构造方法<br> * 根据已经取得连接的FTPTools得到连接信息<br> * 根据参数取得下载信息 * @param rowIndex * @param filepath * @param filesize * @param savepath */ public FTPThread(int rowIndex, String filepath, long filesize, String savepath) { super("FTPThread"); host = FTPTools.host; port = FTPTools.port; user = FTPTools.user; pswd = FTPTools.pswd; this.rowIndex = rowIndex; this.filepath = filepath; this.filesize = filesize; this.savepath = savepath; ftpThreadLock = new ReentrantLock(); setStatus(Constant.THREAD_STATUS_RUNNABLE); start(); } public FTPThread(int rowIndex, String filepath, long filesize, String savepath, int status) { super("FTPThread"); host = FTPTools.host; port = FTPTools.port; user = FTPTools.user; pswd = FTPTools.pswd; this.rowIndex = rowIndex; this.filepath = filepath; this.filesize = filesize; this.savepath = savepath; ftpThreadLock = new ReentrantLock(); setStatus(status); start(); } public void run() { getFTPService(); getFTPConnect(host, port); if(doLoginFTP(user, pswd)) { ResumeBrokenTransferByThread(this, rowIndex, filepath, filesize, savepath); } } /** * 获取FTPService接口实现类<br> * 首先从配置文件中找<br> * 如果没有则加载默认的实现类 * @return * @throws InstantiationException * @throws IllegalAccessException * @throws ClassNotFoundException */ public void getFTPService(){ try { ftpService = (FTPService)Class.forName(PropertyUtil.getProperty("ftp.service.name", FTPService.FTP_SERVICE_NAME)).newInstance(); } catch (Exception e) { e.printStackTrace(); } } /** * 根据服务器地址、端口获得ftp链接 * @param host * @param port * @return */ public String getFTPConnect(String host, int port) { return ftpService.getFTPConnect(host, port); } /** * 执行登录 * @param user * @param pswd * @return */ public boolean doLoginFTP(String user, String pswd) { return ftpService.doLoginFTP(user, pswd); } /** * 以断点续传的方式下载文件 * @param rowIndex * @param filepath * @param filesize * @param savepath */ public void ResumeBrokenTransfer(int rowIndex, String filepath, int filesize, String savepath) { ftpService.ResumeBrokenTransfer(rowIndex, filepath, filesize, savepath); } /** * 以多线程、断点续传的方式下载文件 * @param rowIndex * @param filepath * @param filesize * @param savepath */ public void ResumeBrokenTransferByThread(FTPThread ftpThread, int rowIndex, String filepath, long filesize, String savepath) { ftpService.ResumeBrokenTransferByThread(ftpThread, rowIndex, filepath, filesize, savepath); } /** * 在指定文件路径下查找临时文件合并为一个文件 * @param filepath * @param threadCount */ public void mergerTempFile(String filepath, int threadCount) { System.out.println("开始合并文件"); try { BufferedOutputStream data_output = new BufferedOutputStream(new FileOutputStream(filepath)); byte[] temp = new byte[Constant.TEMP_BYTE_LENGTH]; for(int i = 0; i < threadCount; i ++) { File tempFile = new File(filepath + Constant.DOWNLOAD_TEMP_NAME + i); BufferedInputStream data_input = new BufferedInputStream(new FileInputStream(tempFile)); int read = 0; int hadRead = 0; while((read = data_input.read(temp, 0, temp.length)) != -1) { data_output.write(temp, 0, read); hadRead += read; } data_input.close(); } data_output.close(); } catch (Exception e) { e.printStackTrace(); } setHadMerger(true); System.out.println("合并文件完成"); deleteTempFile(filepath, threadCount); } /** * 合并文件完成后删除临时文件 * @param filepath * @param threadCount */ public void deleteTempFile(String filepath, int threadCount) { if(isHadMerger()) { for(int i = 0; i < threadCount; i ++) { File tempFile = new File(filepath + Constant.DOWNLOAD_TEMP_NAME + i); tempFile.delete(); } } } }
FTP接口实现类中的ResumeBrokenTransferByThread方法
/**
* 使用多线程、断点续传方式下载文件<br>
* 首先查找要保存的路径下有无缓存文件(以.wfml为后缀)<br>
* 不存在 重新开始下载<br>
* 存在 继续<br>
* 重新开始下载<br>
* 读取配置文件要分多少个线程来下载文件<br>
* 按照文件大小、线程数量来分配每个线程要下载的文件大小、文件名<br>
* 开始断点续传下载<br>
* 继续下载<br>
* 开始断点续传下载<br>
* @param rowIndex
* @param filepath
* @param filesize
* @param savepath
*/
public void ResumeBrokenTransferByThread(final FTPThread ftpThread, final int rowIndex, final String filepath, final long filesize, final String savepath) {
final String filename = filepath.substring(filepath.lastIndexOf("/") + 1, filepath.length());
final byte[] temp = new byte[Constant.TEMP_BYTE_LENGTH];
//得到要创建的线程数量
final int threadCount = Integer.parseInt(PropertyUtil.getProperty(Constant.RESUME_THREAD_COUNT_PROPNAME, Constant.RESUME_THREAD_COUNT_DEFAULT));
final String[] downloadSizeArray = SystemTools.getDownloadSizeArray(filesize, threadCount);
for(int i = 0; i < threadCount; i ++) {
File temp_file = new File(savepath + File.separator + filename + Constant.DOWNLOAD_TEMP_NAME + i);
System.out.println("文件" + i + "大小为:" + temp_file.length());
ftpThread.hadRead += temp_file.length();
}
System.out.println("ftpThread.hadRead : " + ftpThread.hadRead);
for(int i = 0; i < threadCount; i ++) {
final int index = i;
Thread resumeThread = new Thread(){
//当前线程的缓存文件
File tempFile = new File(savepath + File.separator + filename + Constant.DOWNLOAD_TEMP_NAME + index);
public void run() {
SocketFTPService socketFTPService = new SocketFTPService();
socketFTPService.getFTPConnect(host, port);
if(socketFTPService.doLoginFTP(user, pswd)) {
try {
int read = 0;
int hadRead = 0;
//当前线程要下载的文件大小
String downsize = downloadSizeArray[index].split(":")[1];
//当前线程要下载的文件起始点
String skipsize = downloadSizeArray[index].split(":")[0];
//将hadRead(已读文件大小)置为缓存文件的大小
hadRead = (int)tempFile.length();
//设定文件指针(下载位置)
//socketFTPService.doFTPCommand("REST " + (Integer.parseInt(skipsize) + temp_file.length()));
//readRespond();
socketFTPService.dataSocket = socketFTPService.getDataSocket();
socketFTPService.doFTPCommand("RETR " + filepath);
BufferedInputStream data_input = new BufferedInputStream(socketFTPService.dataSocket.getInputStream());
RandomAccessFile raf = new RandomAccessFile(tempFile, "rw");
//跳过当前线程要下载的文件起始点和缓存文件大小之和
data_input.skip(Integer.parseInt(skipsize) + hadRead);
raf.seek(hadRead);
System.out.println("线程" + index + "已下载 " + hadRead);
if(ftpThread.startTime == 0) {
ftpThread.startTime = System.currentTimeMillis();
}
SystemTools.addObserver();
while(hadRead < Integer.parseInt(downsize)) {
if(ftpThread.getStatus() == Constant.THREAD_STATUS_RUNNABLE) {
while((read = data_input.read(temp, 0, temp.length)) != -1) {
int temp_hadRead = hadRead;
if((temp_hadRead += read) > Integer.parseInt(downsize)) {
read = Integer.parseInt(downsize) - hadRead;
}
raf.write(temp, 0, read);
hadRead += read;
ftpThread.ftpThreadLock.lock();
try {
ftpThread.hadRead += read;
} finally {
ftpThread.ftpThreadLock.unlock();
}
SystemTools.getCurrentSpeed(rowIndex, ftpThread.startTime, ftpThread.hadRead);
SystemTools.getPrice(rowIndex, ftpThread.hadRead, filesize);
SwingUtilities.invokeLater(SystemTools.updateProgressBarRunnable);
}
System.out.println("第" + index + "个线程完成下载" + hadRead + ",完成下载" + ftpThread.hadRead);
raf.close();
if(hadRead == tempFile.length()) {
ftpThread.setCompleted(ftpThread.getCompleted() + 1);
System.out.println(ftpThread.getCompleted());
}
if(ftpThread.getCompleted() == threadCount && ftpThread.hadRead == filesize) {
ftpThread.endTime = System.currentTimeMillis();
SystemTools.getFinalSpeed(rowIndex, ftpThread.startTime, ftpThread.endTime, filesize);
ftpThread.mergerTempFile(savepath + File.separator + filename, threadCount);
}
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
};
resumeThread.start();
}
}
欢迎拍砖!
评论
12 楼
SavageGarden
2009-12-28
感谢凤舞凰扬的耐心指点!
感谢xiaobao0501给的链接,我的这个的确和他的非常像,比较中才发现自己犯了个低级错误,虽然在每个线程中都实例化了新的的BufferedInputStream、BufferedOutputStream来读取数据,但是用来协助读取的byte数组
byte[] temp = new byte[Constant.TEMP_BYTE_LENGTH];
(原帖中已标为红色)
却写成了公用,结果导致“偶尔会出现下载下来的文件无法打开或报文件已损坏”的问题,将其写在线程中后即可正常下载。
感谢xiaobao0501给的链接,我的这个的确和他的非常像,比较中才发现自己犯了个低级错误,虽然在每个线程中都实例化了新的的BufferedInputStream、BufferedOutputStream来读取数据,但是用来协助读取的byte数组
byte[] temp = new byte[Constant.TEMP_BYTE_LENGTH];
(原帖中已标为红色)
却写成了公用,结果导致“偶尔会出现下载下来的文件无法打开或报文件已损坏”的问题,将其写在线程中后即可正常下载。
11 楼
xiaobao0501
2009-12-25
建议楼主先看这个贴子
http://www.iteye.com/topic/427397?page=1
类似的实现.只不过你是要实现ftp
http://www.iteye.com/topic/427397?page=1
类似的实现.只不过你是要实现ftp
10 楼
whaosoft
2009-12-25
不要在为难lz了 已经很不错了 第一版都不会很好的 希望赶紧更新
9 楼
凤舞凰扬
2009-12-24
引用
1. 滥用的synchronized
其实是还不会用。。。
其实对于你的类中setter/getter方法大多不需要使用这个关键字;而对于线程回收以及状态判断时就有可能需要。这里面的问题比较复杂,不是一下子可以说清的。
引用
2. 不能确保关闭的文件流(如果出现异常,就无法关闭文件流)
其实是还没有做异常处理。。。
其实不管异常是否处理,一定要确保流能被正确关闭,所以应该放在finally,而不是正确执行的后面。
引用
3. 方法名首字母大写,一看楼主就是做.net转做java的。
其它的都小写的,唯独贴出来的这个大写了是因为“ResumeBrokenTransfer”这个词是从网上搜来了,自己不知道“断点续传”咋翻译,也就没改成小写,不过我确实没有碰过.net。。。
这倒是我误解了,只是因为我有做.net的同事经常有这种习惯,呵呵。
引用
4. 基本无效的异常处理。
同2
多线程程序中异常处理是其健壮性的重要保证,所以一定要重视。
引用
5. 因为异常而导致的线程泄漏。
线程泄露?请不吝指教,多谢!
对于你for循环中的线程来说,因为你前面如果出现异常,就有可能导致该线程无法正确地处理信息,同时相对应的资源没有被关闭,从而出现问题。
引用
6. 子线程还没有执行完,主线程就会退出,这样子线程就丝毫没有任何管理。
子线程还没有执行完,主线程就会退出?测试时从来没有发生过,请问您怎么得出的这个结论?
子线程还没有执行完,主线程就会退出?测试时从来没有发生过,请问您怎么得出的这个结论?
因为你的主程序执行完方法ResumeBrokenTransferByThread就已经结束了,而在方法ResumeBrokenTransferByThread中是启动另外的线程去下载文件。而这些线程已经脱离了你程序的管理。你根本就无法控制它们(比如停止等等,错误恢复等等)。对于多线程程序是一定要设计一个控制线程的。
引用
确实是第一次写这种程序,感谢您的指教,谢谢!
第一次已经很不错了,其实很值得鼓励,多写几次,多尝试,就会有经验了。
8 楼
SavageGarden
2009-12-24
<p>首先非常感谢大家的关注!<br>其次,</p>
<p>xzqttt</p>
<p> </p>
<p>“个人感觉问题应该出现在这几个地方,一是从网络读取的数据是否真实度到了本地;二是文件合并的时候是否数据真的写入了合并后的文件中。<br>确保BufferedOutputStream中的数据已经处理干净了<br>确保RandomAccessFile的读取数据正确”</p>
<p> </p>
<p>一针见血!偶尔会出现下载下来的文件无法打开或报文件已损坏,一直以为是线程方面的问题,感谢指点解决问题的方向!</p>
<p> </p>
<p>prowl</p>
<p> </p>
<p>“我想看FtpService”</p>
<p> </p>
<p>第二段代码即为FtpService实现类中的ResumeBrokenTransferByThread方法</p>
<p> </p>
<p>凤舞凰扬</p>
<p> </p>
<p>“1. 滥用的synchronized </p>
<p> <span style="color: #ff0000;">其实是还不会用。。。</span><br>2. 不能确保关闭的文件流(如果出现异常,就无法关闭文件流)</p>
<p> <span style="color: #ff0000;">其实是还没有做异常处理。。。</span><br>3. 方法名首字母大写,一看楼主就是做.net转做java的。</p>
<p> <span style="color: #ff0000;">其它的都小写的,唯独贴出来的这个大写了是因为“<span><span>ResumeBrokenTransfer</span></span>”这个词是从网上搜来了,自己不知道“断点续传”咋翻译,也就没改成小写,不过我确实没有碰过.net。。。</span><br>4. 基本无效的异常处理。</p>
<p> <span style="color: #ff0000;">同2</span><br>5. 因为异常而导致的线程泄漏。</p>
<p> <span style="color: #ff0000;">线程泄露?请不吝指教,多谢!</span><br>6. 子线程还没有执行完,主线程就会退出,这样子线程就丝毫没有任何管理。<br> <span style="color: #ff0000;">子线程还没有执行完,主线程就会退出?测试时从来没有发生过,请问您怎么得出的这个结论?</span><br> 这样的程序学习做sample用是可以的,不过离真正的应用还有蛮大的距离。</p>
<p> <span style="color: #ff0000;"> 确实是第一次写这种程序,感谢您的指教,谢谢!</span></p>
<p> </p>
<p>再次感谢大家的关注和指教,谢谢!</p>
<p>xzqttt</p>
<p> </p>
<p>“个人感觉问题应该出现在这几个地方,一是从网络读取的数据是否真实度到了本地;二是文件合并的时候是否数据真的写入了合并后的文件中。<br>确保BufferedOutputStream中的数据已经处理干净了<br>确保RandomAccessFile的读取数据正确”</p>
<p> </p>
<p>一针见血!偶尔会出现下载下来的文件无法打开或报文件已损坏,一直以为是线程方面的问题,感谢指点解决问题的方向!</p>
<p> </p>
<p>prowl</p>
<p> </p>
<p>“我想看FtpService”</p>
<p> </p>
<p>第二段代码即为FtpService实现类中的ResumeBrokenTransferByThread方法</p>
<p> </p>
<p>凤舞凰扬</p>
<p> </p>
<p>“1. 滥用的synchronized </p>
<p> <span style="color: #ff0000;">其实是还不会用。。。</span><br>2. 不能确保关闭的文件流(如果出现异常,就无法关闭文件流)</p>
<p> <span style="color: #ff0000;">其实是还没有做异常处理。。。</span><br>3. 方法名首字母大写,一看楼主就是做.net转做java的。</p>
<p> <span style="color: #ff0000;">其它的都小写的,唯独贴出来的这个大写了是因为“<span><span>ResumeBrokenTransfer</span></span>”这个词是从网上搜来了,自己不知道“断点续传”咋翻译,也就没改成小写,不过我确实没有碰过.net。。。</span><br>4. 基本无效的异常处理。</p>
<p> <span style="color: #ff0000;">同2</span><br>5. 因为异常而导致的线程泄漏。</p>
<p> <span style="color: #ff0000;">线程泄露?请不吝指教,多谢!</span><br>6. 子线程还没有执行完,主线程就会退出,这样子线程就丝毫没有任何管理。<br> <span style="color: #ff0000;">子线程还没有执行完,主线程就会退出?测试时从来没有发生过,请问您怎么得出的这个结论?</span><br> 这样的程序学习做sample用是可以的,不过离真正的应用还有蛮大的距离。</p>
<p> <span style="color: #ff0000;"> 确实是第一次写这种程序,感谢您的指教,谢谢!</span></p>
<p> </p>
<p>再次感谢大家的关注和指教,谢谢!</p>
7 楼
黑色联想
2009-12-24
貌似.net方面的方法名是大写开头,而java方面方法名首字母小写,常量全大写!
6 楼
凤舞凰扬
2009-12-24
我是指出楼主的问题,不是说方法首字母要大写。
5 楼
li445970924
2009-12-24
方法名首字母一定要大写么 我看 什么equals。。。valueOf 不也是小写么
4 楼
ipconfiger
2009-12-24
==================================================
3. 方法名首字母大写,一看楼主就是做.net转做java的。
==================================================
真是很精屁啊
3. 方法名首字母大写,一看楼主就是做.net转做java的。
==================================================
真是很精屁啊
3 楼
凤舞凰扬
2009-12-23
我也指几个问题吧:
1. 滥用的synchronized
2. 不能确保关闭的文件流(如果出现异常,就无法关闭文件流)
3. 方法名首字母大写,一看楼主就是做.net转做java的。
4. 基本无效的异常处理。
5. 因为异常而导致的线程泄漏。
6. 子线程还没有执行完,主线程就会退出,这样子线程就丝毫没有任何管理。
这样的程序学习做sample用是可以的,不过离真正的应用还有蛮大的距离。
1. 滥用的synchronized
2. 不能确保关闭的文件流(如果出现异常,就无法关闭文件流)
3. 方法名首字母大写,一看楼主就是做.net转做java的。
4. 基本无效的异常处理。
5. 因为异常而导致的线程泄漏。
6. 子线程还没有执行完,主线程就会退出,这样子线程就丝毫没有任何管理。
这样的程序学习做sample用是可以的,不过离真正的应用还有蛮大的距离。
2 楼
prowl
2009-12-23
我想看FtpService
1 楼
xzqttt
2009-12-23
没耐心看完代码
个人感觉问题应该出现在这几个地方,一是从网络读取的数据是否真实度到了本地;二是文件合并的时候是否数据真的写入了合并后的文件中。
确保BufferedOutputStream中的数据已经处理干净了
确保RandomAccessFile的读取数据正确
一般遇到这样中问题就是使用debug模式跑一边,如果最终合并之后的文件数据的byte数组中,出现连续的000000,肯定是数据没有读过来导致的
个人感觉问题应该出现在这几个地方,一是从网络读取的数据是否真实度到了本地;二是文件合并的时候是否数据真的写入了合并后的文件中。
确保BufferedOutputStream中的数据已经处理干净了
确保RandomAccessFile的读取数据正确
一般遇到这样中问题就是使用debug模式跑一边,如果最终合并之后的文件数据的byte数组中,出现连续的000000,肯定是数据没有读过来导致的
发表评论
-
基于Hadoo的日志收集框架---Chukwa的源码分析(数据处理)
2012-03-06 18:12 35971.工具类、接口简介 (1) // 用于对数据进行分 ... -
基于Hadoo的日志收集框架---Chukwa的源码分析(收集器)
2012-03-06 17:46 25541.接口、实现类简介 org.apache.hado ... -
Java串口编程----使用SMSLib发送手机短信
2010-02-25 22:43 7268完整日志: SLF4J: Class path contai ... -
超级简单、超级实用的版本升级小工具----代码实现
2010-02-23 17:50 1780接上篇 webserver使用的是resin3.1.9,首先 ... -
超级简单、超级实用的版本升级小工具----功能预览
2010-02-23 17:15 1203项目做久了, ... -
Swing JTable 渲染器 进度条 事件线程 观察者模式
2009-12-07 13:48 3418Swing编程中JTable应该是个经常被用到的组件,进度条也 ... -
用swing做界面,写了个支持断点续传的ftp客户端
2009-12-03 15:47 2032最近在写一个支持多线程、断点续传方式(需要服务器支持)下 ... -
JPA的OneToMany和ManyToOne
2008-09-04 22:43 7092在appfuse2下写个测试,用到了一对多,看看了资料 ... -
用HttpClient实现同步RTX
2008-08-12 18:04 2136持续加班,到现在都还没有缓过劲来,每天下班回来基本上就 ... -
公交车报站类
2008-07-16 21:46 1108****到了,去往****的乘客,请您前后门下车,下车请走好, ...
相关推荐
《Android多线程断点续传下载网络上的音/视频等各种文件》多线程,断点续传,各种网络上的数据,下载网络上的数据时基本功!加油了各位!
点对点多线程 断点续传的实现,是一个word 教程
java相关的 ftp知识 如:ftp服务器、ftp主被动通讯模式、断点续传、单个文件多线程下载
1. 把每个下载文件切成若干个块(Block),然后得到一个位图,用来标记每个块的下载情况,并保存到文件里,用于实现断点续传。 2. HTTP Header里增加Range,如果服务器返回Cotent-Range 说明服务器支持文件定位,可以...
python多线程,断点续传下载程序,功能比较简单,可以进行二次开发。实现更好用的 功能。
java FTP多线程 批量 断点续传,使用 1.建一个支持多线程FTP服务端; 如:xxftp有Windows和Linux版本; 2.建一个项目导入文件测试;
采用Visual C++ 6.0开发的一个TCP文件传输系统,采用多线程的传输方式,支持断点续传,利用配置文件设置基本的初始化信息。 文件包括源代码和安装包,源代码里包括自定义的文件传输通信协议。 程序采用分层的设计...
java实现FTP多线程断点续传,上传下载! - java学习与交流 - j2ee学习网 - j2ee学习网 (2012年5月21日) 用 Java 实现断点续传 (HTTP) (2012年5月21日) Java写的支持断点续传的FTP--crybaby的博客 (2012年5月21日) ...
Android实现网络多线程下载,断点续传,压缩包内有两个项目: downloadDemo:多线程下载 MulThreadDownloader:断点续传(网上别人的项目)
多线程网络传输大都没有实现大于2G文件,在前人基础上改写的真正的多线程网络传输,不受文件大小的限制!先上传大文件上传的完整代码,有需要大文件超过2G的下载,请留言!
最近研究了一下socket套接字 实现java多线程 断点续传文件 在网上查找了很多例子 然后学习了大家的方法 最后利用网上的例子 自己整合了一份多线程 断点续传文件的代码 并且能实现客户端发送完毕之后 接收服务器端的...
点量Http、FTP多线程断点续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。点量Http/FTP下载组件(DLL)支持...
用vc写的断点续传程序,应用多线程断点续传的编程实例,可以作为模板
基于android实现下载网络资源,文件、多媒体等,采用多线程,实现了断点续传。
socket做的支持多线程断点上传or断点续传Java源码
本程序用vc实现一种简单有效,且具备多线程断点续传的方法来实现点与点指阿健的文件传送。
C# 大文件下载 断点续传 类似迅雷的下载,可以自行实现多线程下载、任务导入导出、等功能
多线程socket文件传输_支持断点续传_收发消息_点对多点
本项目完成的功能类似与迅雷等下载工具所实现的功能——实现多线程断点下载。 主要设计的技术有: 1、android中主线程与非主线程通信机制。 2、多线程的编程和管理。 3、android网络编程 4、自己设计实现设计...