FTP断点续传

一,最重要的一点,断点续传需要服务器的支持,这个是必要条件。       
  传统的FTP   SERVER是不支持断点续传的,因为它不支持REST指令,传统的FTP指令(我是指服务器端指令)并不包括REST指令。       
    
  第二,客户端要知道使用REST等一系列指令来作断点续传。       
    
  看看断点续传的详细过程(FTP   SERVER):       
  首先客户端使用REST指令来告诉FTP   SERVER它需要从文件的某个点开始传,接着用STOR或者RETR命令开始传文件,大概的命令的流程如下:       
    
  TYPE   I       
  200   Type   set   to   I.       
  PASV       
  227   Entering   Passive   Mode   (204,48,18,69,98,250)       
  REST   187392       
  350   Restarting   at   187392.   Send   STORE   or   RETRIEVE   to   initiate   transfer.       
  RETR   /pub/audio/pci/maestro-3/win2k/1056.zip       
  150   Opening   BINARY   mode   data   connection   for   /pub/audio/pci/maestro-3/win2k/1056.zip   (936098   bytes).       
    
  首先使用TYPE命令告诉FTP   SERVER使用BINARY模式传送文件;       
  然后使用PASV命令告诉FTP   SERVER使用被动打开模式来传送文件;       
  接着使用REST   187392指令告诉FTP   SERVER要从文件的187392字节开始传送;       
  最后使用RETR指令来传送文件。       
    
  从上面可以看出,这个FTP   SERVER支持REST指令,有的FTP   SERVER(特别的老的)是不支持这个指令的,这时即使FTP   CLIENT支持断点续传也一点用都没有!       
    
  支持断点的FTP   SERVER:Serv-U   FTP,还有一系列的新出现的FTP   SERVER;       
  不支持断点的:IIS4以前版本所带的都不行,IIS5   有,不家可以测试一下,登录进FTP   SERVER,然后输入REST   1000命令,看服务器是否认识,认识就是支持断点。

FTP实现断点续传

 

FTP客户端实现要建立两个通道,一个控制命令通道,让FTP服务器知道客户端要干什么,一个数据传输通道。所谓的两个通道只不过是两个调用了connect函数的连接,只是控制命令通道专门用来传输一些字符串命令信息,而数据通道则是用来传输文件。控制命令通道一定是由客户端向服务器的连接(默认的端口是21,也可以指定端口,这要看服务器的设置)。连接的过程完成了FTP的登录。数据通道则不一定啦,具体哪个连哪个,请看下面对PASV命令的解释。 

 

  其实FTP断点续传的原理很简单,可分为断点下载和断点上传。 

  客户端的实现步骤如下: 

一、下载:  

1、向服务器发送“REST + 本地文件长度”命令,告诉服务器,客户端要断点下载了。这时服务器还不知道客户端要下载哪个文件; 

   要实现FTP的断点续传,FTP服务器必须支持REST指令,这条指令在FTP协议文本RFC959中就已经定义了,不过它不是FTP服务器必须支持的指令。一般,你可以在下载前使用REST 100命令进行实验,如果服务器正常执行了这条命令,说明该服务器支持FTP断点续传。REST后面跟的数表示下载文件的起始位置,而REST 0表示从文件最开始处下载。REST命令本身并不执行下载功能,你仍需要使用RETR命令执行下载工作。 

2、向服务器发送“RETR + 文件名”命令,通知服务器要下载的文件名,这时服务器开始定位文件指针读文件并发送数据。 

3、客户端定位本地文件指针(文件末尾); 

4、两端的准备工作都做完了以后,客户端创建socket,以被动或非被动方式建立数据通道,循环调用recv接收数据并追加入本地文件; 

 

二、上传: 

1、获取服务器上和本地要上传文件的同名文件大小; 

2、向服务器发送“APPE + 文件名”,通知服务器,接下来从数据通道发送给你的数据要附加到这个文件末尾。 

3、定位本地文件指针(和FTP上文件大小相同的位置) 

4、从文件指针处读数据并发送。 

 

  好了,FTP断点续传的原理就这么简单。代码里将断点上传和断点下载放到同一个函数(MoveFile)里,通过get参数说明是上传还是下载。当然,整个FTP类的实现有800多行,包括登录、退出、获取FTP文件大小、删除FTP服务器上文件、响应服务器,解析响应信息等函数。相应的注释代码里都有,这里就不一一熬述了。 

 

  这里重点说说PASV模式,即被动模式,这是FTP命令里比较不容易理解的一个,这条命令请求服务器在某个端口(非FTP默认端口或控制命令端口)创建一个监听socket,服务器创建的端口号会在客户端的控制命令通道上得到响应。得到这个端口号后,客户端就可以创建新的socket(数据通道)connect过去,并进行文件传输等工作。否则,如果为非被动模式,那么监听的socket由客户端创建,服务器connect过来。 

 

  对于这条命令的存在我是这么理解的,存在这么一种情况:客户端的IP是个内网的IP,服务器的IP是个外网的,当进行数据传输时内网的IP对于服务器是不可见的,只有由服务器启动监听socket才能建立数据通道,所以必须以被动模式进行。:)

posted on 2016-01-15 17:04  duanxz  阅读(20812)  评论(2编辑  收藏  举报