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命令的解释。 socket

 

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

  客户端的实现步骤以下: 测试

1、下载:  指针

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

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

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

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

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

 

2、上传: 

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

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

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

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

 

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

 

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

 

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

相关文章
相关标签/搜索