ftp服务器端协议分析以及java版本实现
2013-11-06 16:58
316 查看
前一段时间,由于项目需要,两个模块之间能够进行文件的传输,当然开始想到的都是利用java io流进行传输,但考虑到通用性,最后决定利用ftp进行传输,网上找了一下,apache有一个开源的java版本的ftp服务器实现,但下载下来后发现很大(写的比较详细,多),不容易集成到我们自己的模块之内,于是最后决定实现一个自己的java版本的ftp服务器。
在研究的过程中,确实是遇到了许多问题,对ftp协议的不够了解,包括多客户端(flashxp,filezilla,ftpclient等)的问题,就是一个兼容性问题,还有ipv4和ipv6的问题。现在能够支持的是ipv4,因为ipv6是又重新增加了新的命令。在研究的过程中,借助了一下工具,有flashxp,filezilla client和filezilla server 以及cmd的ftp命令。
其实,在学校的时候就用过ftp,但其实并不是很理解,只是知道在学校网络的时候ftp默认开的是21端口和20端口。知道现在才有了深入的了解,这里的21端口也就是服务器要开的端口,就是服务端口。20则是服务器和客户端进行传输数据时的端口,而这个端口并不是要对外开放的,而是往外发数据时所使用的端口。这里其实还有一个端口,就是命令端口(PI),数据端口为DTP。
在理解了ftp基本的协议之后,再看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> 由服务器提供的站点特殊参数
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>> 系统登录的用户名
标准 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 文件名不允许
下面是我在实现的过程中借助于flashxp和filezilla client和filezilla server 获取通信数据的方式,可以参考
代码详解我的sorceforge svn仓库里面。
在研究的过程中,确实是遇到了许多问题,对ftp协议的不够了解,包括多客户端(flashxp,filezilla,ftpclient等)的问题,就是一个兼容性问题,还有ipv4和ipv6的问题。现在能够支持的是ipv4,因为ipv6是又重新增加了新的命令。在研究的过程中,借助了一下工具,有flashxp,filezilla client和filezilla server 以及cmd的ftp命令。
其实,在学校的时候就用过ftp,但其实并不是很理解,只是知道在学校网络的时候ftp默认开的是21端口和20端口。知道现在才有了深入的了解,这里的21端口也就是服务器要开的端口,就是服务端口。20则是服务器和客户端进行传输数据时的端口,而这个端口并不是要对外开放的,而是往外发数据时所使用的端口。这里其实还有一个端口,就是命令端口(PI),数据端口为DTP。
在理解了ftp基本的协议之后,再看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> 由服务器提供的站点特殊参数
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>> 系统登录的用户名
标准 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 文件名不允许
下面是我在实现的过程中借助于flashxp和filezilla client和filezilla server 获取通信数据的方式,可以参考
代码详解我的sorceforge svn仓库里面。
相关文章推荐
- leetcode:Copy List with Random Pointer 细致分析,以及代码实现(JAVA版本)
- 微信小程序下nginx代理wss,实现兼容原本服务协议ws,Java版本
- 对KMP的理解,以及kmp算法java版本实现
- Hash表分析以及Java实现
- Java实现FTP服务器功能实例代码
- 堆排序的Java实现、性能分析以及适用场景
- 归并排序的Java实现、性能分析以及适用场景
- 观察者模式II--Java原生实现分析以及一种全新的观察者模式
- 回首Java——八大排序以及冒泡排序,插入排序分析实现
- Java实现ftp上传下载、删除文件及在ftp服务器上传文件夹的方法
- java实现把文件上传至ftp服务器
- Java连接FTP服务器并且实现对其文件的上传和下载
- Java利用ssh协议实现本地文件到远程Linux服务器的上传。
- 用Java实现FTP服务器-Java基础-Java-编程开发
- 冒泡排序的Java实现、性能分析以及适用场景
- java中的线程池实现以及代码分析
- ssm框架中,上传的资料存放在另外一台ftp服务器中是如何实现的?以及编码问题
- java实现ftp跨服务器上传文件并用html5流媒体播放
- Java代码实现上传文件到Ftp服务器
- Java连接FTP服务器并且实现对其文件的上传和下载