java操作FTP时遇到的问题小结

来源:互联网 发布:战龙三国典藏进阶数据 编辑:程序博客网 时间:2024/06/07 22:19
今天在做java开发FTP文件上传时,遇到了一些问题。现在项目完成了,有时间总结一下。我用的第三方jar是:etdftpj-1.4.5.jar。

问题一:java在获取FTP Client时,指定路径在Windows和Linux下的表示方式不同。
Windows FTP Server:"/folder";
Linux FTP Server:"\folder"。

问题二:FTP访问方式
FTP是仅基于TCP的服务,它使用两个端口,一个命令端口,一个数据端口。通常情况下,命令端口号21,数据端口号20.但是由于FTP的访问方式不同,数据端口号不一定是20。
1、主动模式


第一步:客户端的命令端口与FTP服务器端的命令端口21建立连接,并发送命令"PORT 1027";
第二步:FTP服务器的命令端口给客户端的命令端口回一个"ACK";
第三步:FTP服务器发起一个从它自己的数据端口20向客户端先前指定的数据端口20的连接;
第四步:客户端给FTP服务器回一个"ACK"。
2、被动模式(PASV)


第一步:客户端的命令端口与FTP服务器端的命令端口21建立连接,并发送命令"PASV";
第二步:FTP服务器返回一个命令"PORT 2024",告诉客户端用哪个端口侦听数据连接;
第三步:客户端初始化一个从自己的数据端口到FTP服务器指定的数据端口的连接;
第四步:FTP服务器给客户端回一个"ACK"。
总结:
主动FTP:
    命令连接:客户端 >1023端口 -> 服务器 21端口
    数据连接:客户端 >1023端口 <- 服务器 20端口
被动FTP:
    命令连接:客户端 >1023端口 -> 服务器 21端口
    数据连接:客户端 >1023端口 -> 服务器 >1023端口
下面是主动与被动FTP优缺点的简要总结:
    主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
    幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。

问题三:实现在FTP服务器上移动文件
rename(fileName, ../path/fileName);