[置顶] Ftp客户端概要设计
Ftp客户端概要设计
1.概述
ftp是基于TCP的文件传输协议,主要是用于控制远程文件,如下载、上传、续传、重命名、删除等。其命令是基于可见字符,易于理解的方式交互的。客户端与服务器端的交互遵循一应一答的方式,而且各命令间遵循一定的顺序。
FTP的应答原则:
a. 所有应答都以3个数字开头以“\r\n”结束
b. 一个应答的第4位如果为’-’,表示还有后续应答,说明一个命令对应了多个应答
c. 对应一个命令的多个应答,其前面的3个数字一样
d. 非命令的传输都需要开通另外的通道,并且事先需要说明是主动还是被动
FTP客户端需要实现的功能:
a. 登录、退出
b. 列出指定路径下的所有文件名称
c. 下载文件
d. 上传文件
e. 续传文件(上传和下载)
f. 创建目录
g. 重命名文件
功能要求:
a. 同时可以上传和下载多个文件,并不相互影响;
b. 随时可以终止正在上传或下载的文件,并后续续传;
c. 在上传和下载的过程中不影响其他命令的执行;
d. 上传和下载文件可以显示进度信息
2.模块设计
根据概述中的说明,建立如下的模块关系:
对外操作的接口最终转入控制实例中操作。对于外部传入的ftp基本信息(如服务器名、端口号、用户名密码等信息)需存入基本信息模块。操作模块依赖基本信息模块和传输控制模块。一个操作模块完成简单的一次操作,如列出文件列表、上传文件、下载文件。如果需要多个上传或者下载操作则创建多个操作模块。
控制实例的主要作用是:有效组织一个或多个操作模块。
3.接口设计
由于时间关系,这边实现概述中部分功能。
/**
* 设置当前字符集
*/
bool SetCharset(char* charSet);
/**
* 登录ftp服务器
*@host 主机名称,IP地址或者域名
*@port ftp服务器端口,默认可以填21
*@userName ftp用户名,为NULL表示匿名登录
*@password 用户名对应的密码
*@return 登录成功返回true,否则返回false
*/
bool Login(char* host,unsigned shortport,char* userName,char* password);
/**
* 退出ftp服务器,会中断所有传输操作
*@return 登录成功返回true,否则返回false
*/
bool Logout();
/**
* 创建目录
*@dirPath 以'/'开头,必须为绝对路径
*/
bool Mkdir(char* dirPath);
/**
* 将本地文件上传到服务器上
*@localFile 本地文件
*@remoteFile 服务器的文件(绝对路径)
*@callback 传输回调函数,参考FtpTransferCallback的定义
*@lpcontext 回调函数的上下文参数
*@return 返回控制句柄,通过该句柄可以终端传输等
*/
int PutFile(char* localFile,char*remoteFile,FtpTransferCallback callback,LPVOID lpcontext);
/**
* 将内存中的数据上传到服务器上的文件中保存
*@buffer 内存中的数据
*@nLen 数据长度
*@remoteFile 服务器的文件(绝对路径)
*@callback 传输回调函数,参考FtpTransferCallback的定义
*@lpcontext 回调函数的上下文参数
*@return 返回控制句柄
*/
int PutBuffer(BYTE* buffer,int nLen,char*remoteFile,FtpTransferCallback callback,LPVOID lpcontext);
/**
* 获取下载服务器上的文件
*@remoteFile 服务器上的路径(绝对路径)
*@localFile 本地文件路径
*@callback 传输回调函数,参考FtpTransferCallback的定义
*@lpcontext 回调函数的上下文参数
*@return 返回控制句柄
*/
int GetFile(char* remoteFile,char*localFile,FtpTransferCallback callback,LPVOID lpcontext);
/**
* 下载服务器上的文件到指定的内存中
*@remoteFile 服务器上的文件(绝对路径)
*@buffer 指定的内存
*@nLen 可用的内存大小
*@callback 传输回调函数,参考FtpTransferCallback的定义
*@lpcontext 回调函数的上下文参数
*@return 返回控制句柄
*/
int GetFileToBuffer(char* remoteFile,BYTE*buffer,int nLen,FtpTransferCallback callback,LPVOID lpcontext);
/**
* 在ftp服务器上查找相应的文件
*@findFile 需要查找的文件(绝对路径),查找绝对路径下的所有文件
*@return 成功返回查找到的文件个数
* 没有找到文件则返回0
*/
int FindFile(char*findFile);
/**
* 获取下一个文件信息
*@lpFileInfo 文件属性
*@return 成功返回true,遍历完或失败返回false
*/
bool NextFile(OUT LPFtpFileInfolpFileInfo);
附件1 FTP命令表:
|
命令 |
描述 |
|
ABOR |
中断数据连接程序 |
|
ACCT <account> |
系统特权帐号 |
|
ALLO <bytes> |
为服务器上的文件存储器分配字节 |
|
APPE <filename> |
添加文件到服务器同名文件 |
|
CDUP <dir path> |
改变服务器上的父目录 |
|
CWD <dir path> |
改变服务器上的工作目录 |
|
DELE <filename> |
删除服务器上的指定文件 |
|
HELP <command> |
返回指定命令信息 |
|
LIST <name> |
如果是文件名列出文件信息,如果是目录则列出文件列表 |
|
MODE <mode> |
传输模式(S=流模式,B=块模式,C=压缩模式) |
|
MKD <directory> |
在服务器上建立指定目录 |
|
NLST <directory> |
列出指定目录内容 |
|
NOOP |
无动作,除了来自服务器上的承认 |
|
PASS <password> |
系统登录密码 |
|
PASV |
请求服务器等待数据连接 |
|
PORT <address> |
IP 地址和两字节的端口 ID |
|
PWD |
显示当前工作目录 |
|
QUIT |
从 FTP 服务器上退出登录 |
|
REIN |
重新初始化登录状态连接 |
|
REST <offset> |
由特定偏移量重启文件传递 |
|
RETR <filename> |
从服务器上找回(复制)文件 |
|
RMD <directory> |
在服务器上删除指定目录 |
|
RNFR <old path> |
对旧路径重命名 |
|
RNTO <new path> |
对新路径重命名 |
|
SITE <params> |
由服务器提供的站点特殊参数 |
|
SIZE <filename> |
获取服务器上文件的大小 |
|
SMNT <pathname> |
挂载指定文件结构 |
|
STAT <directory> |
在当前程序或目录上返回信息 |
|
STOR <filename> |
储存(复制)文件到服务器上 |
|
STOU <filename> |
储存文件到服务器名称上 |
|
STRU <type> |
数据结构(F=文件,R=记录,P=页面) |
|
SYST |
返回服务器使用的操作系统 |
|
TYPE <data type> |
数据类型(A=ASCII,E=EBCDIC,I=binary) |
|
USER <username>> |
系统登录的用户名 |
附件2 FTP响应表:
|
响应代码 |
解释说明 |
|
110 |
新文件指示器上的重启标记 |
|
120 |
服务器准备就绪的时间(分钟数) |
|
125 |
打开数据连接,开始传输 |
|
150 |
打开连接 |
|
200 |
成功 |
|
202 |
命令没有执行 |
|
211 |
系统状态回复 |
|
212 |
目录状态回复 |
|
213 |
文件状态回复 |
|
214 |
帮助信息回复 |
|
215 |
系统类型回复 |
|
220 |
服务就绪 |
|
221 |
退出网络 |
|
225 |
打开数据连接 |
|
226 |
结束数据连接 |
|
227 |
进入被动模式(IP 地址、ID 端口) |
|
230 |
登录因特网 |
|
250 |
文件行为完成 |
|
257 |
路径名建立 |
|
331 |
要求密码 |
|
332 |
要求帐号 |
|
350 |
文件行为暂停 |
|
421 |
服务关闭 |
|
425 |
无法打开数据连接 |
|
426 |
结束连接 |
|
450 |
文件不可用 |
|
451 |
遇到本地错误 |
|
452 |
磁盘空间不足 |
|
500 |
无效命令 |
|
501 |
错误参数 |
|
502 |
命令没有执行 |
|
503 |
错误指令序列 |
|
504 |
无效命令参数 |
|
530 |
未登录网络 |
|
532 |
存储文件需要帐号 |
|
550 |
文件不可用 |
|
551 |
不知道的页类型 |
|
552 |
超过存储分配 |
|
553 |
文件名不允许 |
作者:wjh_2010@163.com
如果需要动态库(共享库)请以邮件的方式联系作者。
[置顶] Ftp客户端概要设计的更多相关文章
- 爱pia戏推出PC客户端,为您自动置顶窗口,方便查找
爱pia戏推出PC客户端, 可以在无法使用插件的时候,使用PC客户端, 将为您自动置顶窗口,方便查看剧本. 百度网盘下载地址: 链接: http://pan.baidu.com/s/1pLpvn5p ...
- 自定义置顶TOP按钮
简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...
- [Winform]检测exe是否已经运行,并将其置顶
摘要 在很多pc应用中,基本上都需要有这样的判断,保证在一个终端只运行一个winform的client.并且如果最小化了,用户再次双击桌面图标的时候,将client置顶显示. 解决方案 需要使用win ...
- mac内置的FTP工具
在 Mac OS X 系统下,有不少优秀的 FTP 工具,如 Cyberduck.Transmit,但是你是否知道除了这些第三方应用,系统已经为你准备好了一个内置的 FTP 工具?/ M: e0 J% ...
- 在UWP中页面滑动导航栏置顶
最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...
- WinFrom窗体始终置顶
调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...
- winform窗体置顶
winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...
- ahk之路:利用ahk在window7下实现窗口置顶
操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...
- Qt中让Qwidget置顶的方法
一般来是说窗体置顶和取消只要 setWindowFlags(Qt::WindowStaysOnTopHint); setWindowFlags(Qt::Widget); 要 ...
随机推荐
- JDK1.6官方下载
JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin- ...
- day8 - isinstance--issubclass-异常处理-自定义异常
一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 __author__ = 'Administrator' class Foo(object): pass obj ...
- 04-UIKit(UINavigationController、NSAttributeString、UIImageView)
目录: 一.UINavigationController导航视图控制器 二.NSAttributeString属性字符串 三.UIImageView图像处理 回到顶部 一.UINavigationCo ...
- Home键的获取监听,安卓4.0后就不能在onkeydown方法中获取了。怎么办。
Android下得到Home键按下的消息 在Android下,并不能通过onKeyDown这样的事件来截获Home键的消息,其原因在Android的文档中已经明确的说过了 public stati ...
- Jquery progressbar通过Ajax请求获取后台进度演示
项目源代码下载:http://download.csdn.net/detail/nuptboyzhb/6262253 1.简介 本文主要演示Jquery progressbar的进度条功能.js通过a ...
- Android基础总结(精华完整版)
1. 前言 1.1. 什么是3G.4G Ÿ 第三代移动通信技术(3rd - Generation),速率一般在几百Kbps,较之前的2G和2.5G在数据传输速度上有很大提升. Ÿ 第四代移动通信技术( ...
- PHP - 类库
常用的PHP类库,PHP开发者必备[转] PHP开发者常用的PHP类库和组件 PDF 生成器 FPDF - 这量一个可以让你生成PDF的纯PHP类库. Excel 相关 你的站点需要生成Excel?没 ...
- 数据备份--dump(此作者有许多有用的博客文章)
数据中 心操作大量的数据.当遭到破坏时,这就是一场灾难.这时候需要备份来恢复,及时你又大量的备份数据都没用,备份也肯定不是在浪费时间.你也许很幸运从 来没有经历过数据丢失.但是, 由于这种事情极少发生 ...
- Hystrix 使用与分析
转载请注明出处哈:http://hot66hot.iteye.com/admin/blogs/2155036 一:为什么需要Hystrix? 在大中型分布式系统中,通常系统很多依赖(HTTP,hess ...
- HDU 472 Hamming Distance (随机数)
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) To ...