您的位置:首页 > 编程语言 > Java开发

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仓库里面。

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java ftp服务器 协议