一,最重要的一点,断点续传须要服务器的支持,这个是必要条件。
传统的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才能创建数据通道,因此必须以被动模式进行。:)