ftp文件上传

我使用Ser-U在本地建立了一个ftp

如果没有防火墙,并且实现最简单的功能,这样写就行了。

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。

在使用主动模式时,服务端会主动连接客户端,但是在这个过程中连接可能被客户端的防火墙阻止。因为客户端只提供了N+1端口,可能正被防火墙保护着,所以连接不上,N为大于1024的任意值,所以使用特定的规则也有难度。其结果就是客户端不得不放开自己的防火墙策略,自然而然的会有些安全隐患。

在使用被动模式时,由于客户端会主动连接服务端的P端口,所以在这个时候,P(P:为默认值)端口可能被防火墙保护着,所以为了实现ftp连接,它必须开放自己的防火墙。在这个时候服务端变得不安全了。不过在使用被动模式时,由于服务端提供的数据端口P是任意的,不想主动模式中的20是默认的,所以降低了被人窃取数据的风险。从这点看,它又是安全的。

考虑到这点,代码就必须做出些调整。

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端口,或者采用被动模式。

或者是虽然采用被动模式,但是服务端的防火墙阻止了连接。这时候,就不是代码的问题了,要去服务器的防火墙,修改一下配置。

参考资料:

http://chenyoulu.diandian.com/post/2012-11-20/40042052590

http://jackiechen.blog.51cto.com/196075/193883

http://my.oschina.net/caiyuan/blog/6707


















你可能感兴趣的:(java,ftp,主动与被动模式)