最近在做ftp文件上传的时候,开发测试环境上传都没有问题,但是在开发环境缺无法上传,但是也没有报错,纠结了老久。最后看到网上有说FtpClient有主动模式和被动模式之分,而后就处理了。
FTPClient连接FTP服务的时候,Java中org.apache.commons.net.ftp.FTPClient默认用的应该是主动模式。所谓主动模式:就是指用户端连接服务端的时候,告诉服务端,我们之间要进行通讯,数据交换。我申请开拓一个端口,专门使用于我们之间的通信,也即C(client)端主动向S(Server)端发起的请求。被动模式就是指,一开始服务一起来,S端变开启一个端口告诉C端,我们之间的通讯就在这个端口下。也就C端被动的接受服务端。
在文件上传处加上如下代码:ftpClient.enterLocalPassiveMode();
调使用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,由于ftp server可能每次开启不同的端口来传输数据,但是在linux上,因为安全限制,可能某些端口没有开启,所以就出现阻塞。同时,在下载的地方也需要开启被动模式。