最近项目新需求,需要从服务器上下载文件,然后经过处理与整合,再上传到另一台服务器。
首先要进行ftp的连接,虽然不难,但对于一个菜鸟来说,还是要记录一下啦~
我们使用的是FTPClient进行ftp的连接。对于ftp连接,其实还是遇到了很多问题的, 代码问题不大, 因为基本上就是通过host,port,username,password直接连接即可,(下面要说的主要是在java代码中的操作以及输出,不再举例客户端的情况)。代码如下:
public static void main(String[] args) throws IOException {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
FTPClient f = new FTPClient();
f.connect("要连接的ftp地址",端口号);
f.login("用户名", "密码");
//这一句很重要!!!下面进行解释
f.enterLocalPassiveMode();
//返回登录结果状态
int reply = f.getReplyCode();
System.out.println(reply);
FTPFile[] files = f.listFiles("/");
for (int i = 0; i < files.length; i++) {
System.out.println(files[i].getName());
}
if (!FTPReply.isPositiveCompletion(reply)) {
System.out.println(f.list());
f.disconnect();
return ;
}
}
代码比较简单,只是为了简单的ftp连接测试,没有体现出封装性,后续进行代码完善。代码并不难理解,而且网上很多例子,但在操作过程中难免会遇到一些问题,在我多次运行时,不会列出当前目录的列表,ftp返回结果一直是220,就再没有下文,然后经过百度,有的说是环境的问题,有的说是防火墙的问题,当我把防火墙关闭的时候,代码运行正常了,返回230,且打印出了列表。但防火墙关闭也不是个很好的解决办法啊,然后又通过高级设置只允许某固定ip,port可以通过防火墙,但还是不行,后面发现有个很好的解决办法,不需要关闭防火墙,也不需要高级设置,加上了这句:
f.enterLocalPassiveMode();
采用ftp 被动模式 的传输文件协议,这一点很关键。
ftp文件传输协议有两种模式:主动模式和被动模式。
ftp连接过程中,也会出现530等等之类的问题,后查资料了解到ftp返回值详解说明,这里总结一下几个常用的以及经常遇到的返回结果:
220:表示服务就绪,但此时并没有登陆成功(在测试过程中,很多次返回这个状态码,都以为是连接成功了,但一直不会打印出来当前目录的列表,因为这只是刚服务就绪,还没有真正进行连接)
230:连接且登陆成功
530:未登录,登陆错误(用户名或密码错误)
开发过程中我暂时只遇到了这三种返回值的情况,(因为目前只是进行简单的ftp连接),还有很多结果,这里就先不写了,百度上也能搜得到,等遇到问题再来补充。