ftp服务器端协议分析以及java版本实现

         前一段时间,由于项目需要,两个模块之间能够进行文件的传输,当然开始想到的都是利用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仓库里面。

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值