我使用Ser-U在本地创建了一个ftp
java
若是没有防火墙,而且实现最简单的功能,这样写就好了。apache
import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class Test { public static void main(String[] args){ FTPClient ftpClient = new FTPClient(); try{ File file = new File("D:\\downLoad\\笛子基本教程.pdf"); ftpClient.setDefaultPort(21);//端口号 ftpClient.connect("127.0.0.1");//服务器地址 ftpClient.login("rainmanqqst","888888");//用户名和密码 int reply = ftpClient.getReplyCode();//获取链接状况,230为登录成功 if(!FTPReply.isPositiveCompletion(reply)){//检查是否登录成功,值开头为2 ftpClient.disconnect(); System.err.println("FTP refused connection"); }else{ } ftpClient.storeFile("A.pdf",new FileInputStream(file));//传输文件,将文件名设为A.pdf ftpClient.disconnect(); }catch (IOException a){ a.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } } }
然而正式使用的时候,防火墙是一个绕不过去的坎,因此ftp的模式就必须加入进来了。安全
ftp使用的是TCP协议,一般使用两个端口,命令端口(用于接受命令请求)和数据端口(发出数据)。服务器
ftp能够分主动模式(PORT)和被动模式(PASV)。在主动模式中,客户端会使用本身的一个N端口访问服务器的21命令端口,同时开启一个N+1的端口用于监听。而服务端在收到客户端的请求时,会将本身的数据端口20,试图链接到客户端的N+1端口。在被动模式中客户端会首先向服务端声明被动模式,而后开启两个端口N和N+1,其中N端口会链接服务器的21端口,而后服务器告诉客户端一个任意的端口P,客户端会试图使用N+1端口链接上P。post
在使用主动模式时,服务端会主动链接客户端,可是在这个过程当中链接可能被客户端的防火墙阻止。由于客户端只提供了N+1端口,可能正被防火墙保护着,因此链接不上,N为大于1024的任意值,因此使用特定的规则也有难度。其结果就是客户端不得不放开本身的防火墙策略,天然而然的会有些安全隐患。.net
在使用被动模式时,因为客户端会主动链接服务端的P端口,因此在这个时候,P(P:为默认值)端口可能被防火墙保护着,因此为了实现ftp链接,它必须开放本身的防火墙。在这个时候服务端变得不安全了。不过在使用被动模式时,因为服务端提供的数据端口P是任意的,不想主动模式中的20是默认的,因此下降了被人窃取数据的风险。从这点看,它又是安全的。code
考虑到这点,代码就必须作出些调整。blog
import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class Test { public static void main(String[] args){ FTPClient ftpClient = new FTPClient(); try{ File file = new File("D:\\downLoad\\笛子基本教程.pdf"); ftpClient.setDefaultPort(21); ftpClient.connect("127.0.0.1"); ftpClient.login("rainmanqqst","888888"); int reply = ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)){ ftpClient.disconnect(); System.err.println("FTP refused connection"); }else{ } ftpClient.enterLocalPassiveMode();// ftpClient.storeFile("A.pdf",new FileInputStream(file)); ftpClient.disconnect(); }catch (IOException a){ a.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } } }
使用主动模式时,若是服务器20号端口没有开放,在程序运行的过程当中,会一直试图链接,致使运行如下代码时,停滞不前
教程
if(!FTPReply.isPositiveCompletion(reply)){ ftpClient.disconnect(); System.err.println("FTP refused connection"); }else{ }
解决方法是去服务端手动开放20端口,或者采用被动模式。get
或者是虽然采用被动模式,可是服务端的防火墙阻止了链接。这时候,就不是代码的问题了,要去服务器的防火墙,修改一下配置。
参考资料:
http://chenyoulu.diandian.com/post/2012-11-20/40042052590