FTP客户端实现要建立两个通道,一个控制命令通道,让FTP服务器知道客户端要干什么,一个数据传输通道。所谓的两个通道只不过是两个调用了connect函数的连接,只是控制命令通道专门用来传输一些字符串命令信息(注:服务器响应命令后返回的消息也是通过控制命令通道来传输的)。而数据通道则是用来传输文件。控制命令通道一定是由客户端向服务器的连接(默认的端口是21,也可以指定端口,这要看服务器的设置)。连接的过程完成了FTP的登录。
FTP断点续传可分为断点下载和断点上传。
客户端的实现步骤如下:
一、下载:
1、向服务器发送“REST + 本地文件长度”命令,告诉服务器,客户端要断点下载了。这时服务器还不知道客户端要下载哪个文件;
2、向服务器发送“RETR + 文件名”命令,通知服务器要下载的文件名,这时服务器开始定位文件指针读文件并发送数据。
3、客户端定位本地文件指针(文件末尾);
4、两端的准备工作都做完了以后,客户端创建socket,以被动或非被动方式建立数据通道,循环调用recv接收数据并追加入本地文件;
示例:
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中”接收文件流,等待正确的回应。
二、上传:
1、获取服务器上和本地要上传文件的同名文件大小;
2、向服务器发送“APPE + 文件名”,通知服务器,接下来从数据通道发送给你的数据要附加到这个文件末尾。
3、定位本地文件指针(和FTP上文件大小相同的位置)
4 、从文件指针处读数据并发送。