CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

有没有FTP断点续传和多线程下载的例子!?

楼主chinaspxxu(日出东方红似火)2005-02-23 22:31:15 在 .NET技术 / C# 提问

找了好久,都没有找到! 问题点数:100、回复次数:6Top

1 楼isaacyh(发现自己啥都不懂。。。回头学C++)回复于 2005-02-24 08:58:08 得分 40

我只能告诉你FTP断点续传的一些命令。。。。  
   
  下载的续传step如下:  
   
  step1.   查看本地是否有这个文件,如果有,提示用户是覆盖还是续传,用一bool值来记录,如  
  bool   isRest   =   true;  
  step2.   控制端发送"PWD\r\n",接收到正确的回应。  
  step3.   控制端"TYPE   I\r\n",接收到正确的回应。  
  step4.   控制端发送"PASV\r\n",接收到正确的回应,在回应的格式中获得指定的端口,做好指定端口的连接。  
  step5.   控制端发送"SIZE   "+fileName+"\r\n",获得文件大小。(用long型的)  
  step6.   if(isRest   ==   true)  
  {  
  控制端发送   "REST   "+filesize+"\r\n";使服务器搜索服务器端的文件流到指定的断点。  
  }  
  esle{   就是不续传,不用管}  
   
  step7.   控制端发送"RETR   "+fileName+"\r\n",开始从刚才“指定端口的连接的那个socket中”接收文件流,等待正确的回应。  
   
   
  Top

2 楼fangpeng2003(阿房公(阿房制造,http://work.ahfun.net))回复于 2005-02-24 09:01:33 得分 0

gzTop

3 楼kenMoxi(蓝雨)回复于 2005-02-24 09:02:47 得分 0

upTop

4 楼web_gus(树欲静而风不止)回复于 2005-02-24 09:26:26 得分 40

http://www.cnblogs.com/bestcomy/archive/2005/02/03/31950.html  
  http://www.bytemen.net/dev/html/392.htm  
   
  现在有不少软件可实现多线程下载.如NetAnts,JetCar等,其实多线程下载的原理并不复杂,主要的两项技术就是多线程和断点下载。程序中开启多个线程,每个线程利用断点下载,分别下载文件的不同部分,下载完后合并,就可以了。多线程编程很多书已有介绍,这里不再重复,关于断点下载,MFC中提供的CInternetFile类可实现HTTP的断点下载,但无法实现FTP的断点下载。因此,我们只好从FTP协议中的命令入手,自己编写个FTP类,来实现多线程下载。本人编写的CMultiFTP类(在WIN2000+IIS5。0下测试成功)    
   
   
  FTP指令的详细信息,大家可从http://info.internet.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\r\n”,…)(注意:要在命令后加\r\n)。    
   
   
  在介绍多线程下载前,先给大家介绍下连接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变量。主线程中,可建立一定时,定期检查计数器的值,或让下载线程在下载完毕后调用主线程的某个函数。这样,主线程就可随时发现文件已下载完毕,可合并文件了。    
   
   
  多线程下载的程序设计就是这样,一点都不难。看来掌握某些计算机技术,特别是网络技术,最好还是从实现原理入手,掌握其最精华的部分,激发自己的灵感,编写出个优秀软件。老停留在使用别人的组件和函数库的基础上,你的水平不会有太大提高。  
     
  百特门技术网   2004-11-1   16:31:23    
  Top

5 楼snowpine999([彼岸烟花][当你看到☆河灿烂,可会想起我?])回复于 2005-02-24 20:49:13 得分 20

UP   +   学习   +   接分  
   
  UP   +   学习   +   接分  
   
  UP   +   学习   +   接分Top

6 楼yg1982(游)回复于 2005-03-15 20:54:57 得分 0

upTop

相关问题

  • 请问FTP上传是否也支持断点续传和多线程?
  • 求用多线程实现ftp下载的例子
  • 多线程的例子?
  • 哪位大虾有支持多线程、断点续传下载的Ftp或HTTP组件?小弟给高分!
  • 谁有多线程的例子? 急
  • 谁能举个多线程的例子!
  • 谁有多线程的例子?
  • 帮忙编个多线程的例子
  • 一个多线程的例子。。。
  • 求数据库多线程的例子?

关键词

  • 下载
  • 文件
  • 断点
  • 服务器
  • 多线程
  • 执行
  • 连接
  • 线程
  • 端口
  • 控制

得分解答快速导航

  • 帖主:chinaspxxu
  • isaacyh
  • web_gus
  • snowpine999

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo