Java FTPS 拒绝连接并显示“控制和数据连接的 IP 地址不匹配”

问题描述

我正在尝试从 ftp 服务器下载文件。 FileZilla 成功下载的文件。 但是Java应用程序报错“425控制和数据连接的IP地址不匹配”。

禁用地址匹配验证不起作用。 我正在使用 ApacheCommonsNet 库。 远程服务器在 NAT 后面运行,本地服务器在代理后面运行。

我该如何解决这个问题?

package javaappftptest;

import java.io.bufferedoutputstream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.net.socketAddress;

import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPSClient;
import org.apache.commons.net.util.TrustManagerUtils;
 
public class JavaAppFtpTest {

    public static void main(String[] args) {
        String server = "<ftpsHostIP>"; //hostname or hostIP
        int port = 990;                 //port ftps
        String user = "<ftpLogin>";     
        String pass = "<ftpPassword>";
        
        String proxyHost = "<proxyIP>"; //Local proxy params
        int proxyPort = <proxyPort>;
        Type typeProxy = Type.HTTP;
 
        int reply;
        FTPSClient ftpClient = new FTPSClient(true);  //create the ftps client (implicit ftps)

        try {

            SocketAddress addr = new InetSocketAddress(proxyHost,proxyPort); //set proxy params to the client
            Proxy proxy = new Proxy(typeProxy,addr);
            ftpClient.setProxy(proxy);
            
            ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out),true)); //Add protocol listener for logging of commands

            ftpClient.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
            ftpClient.setControlKeepAliveTimeout(10000L);
            ftpClient.setDataTimeout(30000);
            
            System.out.println("Try connect to host " + server + " port " + port);

            ftpClient.connect(server,port);             // connecting to ftps server
            
            ftpClient.execPBSZ(0);                      // set buffer size (unlimit)
            ftpClient.execPROT("P");                    // set protected mode P
            reply = ftpClient.getReplyCode();
            System.out.println("ReplyCode = " + reply);
            
            ftpClient.login(user,pass);                // login to server
            reply = ftpClient.getReplyCode();
            System.out.println("ReplyCode = " + reply);

            String remoteDir = "/201014";                   
            ftpClient.changeWorkingDirectory(remoteDir);    // change remote dir on server
            reply = ftpClient.getReplyCode();
            System.out.println("ReplyCode = " + reply);
            
            ftpClient.printWorkingDirectory();
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);    // set file type (image = binary type)
            reply = ftpClient.getReplyCode();
            System.out.println("ReplyCode = " + reply);
            
            ftpClient.enterLocalPassiveMode();              // set passive mode

            String remoteFile1 = "img22103106251_3.jpg";
            File downloadFile1 = new File("img22103106251_3.jpg");
            
            ftpClient.setRemoteVerificationEnabled(false);  //disable verification of matching command and data addresses
            reply = ftpClient.getReplyCode();
            System.out.println("ReplyCode = " + reply);

            OutputStream outputStream1 = new bufferedoutputstream(new FileOutputStream(downloadFile1));
            boolean success = ftpClient.retrieveFile(remoteFile1,outputStream1);  // download file to local directory

            if (!success) {
                System.out.println("ERROR. File has NOT been downloaded");
            }
           reply = ftpClient.getReplyCode();
            System.out.println("ReplyCode = " + reply);

            outputStream1.close();
 
            if (success) {
                System.out.println("File has been downloaded successfully.");
            }
            

        } catch (IOException ex) {
            System.out.println("Error: " + ex.getMessage());
            ex.printstacktrace();
        } finally {
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
                
            } catch (IOException ex) {
                ex.printstacktrace();
            }
        }
    }
}

输出

Try connect to host <ftpHostIP> port 990
220 %Unauthorized access prohibited%
PBSZ 0
200 PBSZ=0
PROT P
200 Protection level set to P
ReplyCode = 200
USER *******
331 Password required for <ftpLogin>
PASS *******
230 Logged on
ReplyCode = 230
CWD /201014
250 CWD successful. "/201014" is current directory.
ReplyCode = 250
PWD
257 "/201014" is current directory.
TYPE I
200 Type set to I
ReplyCode = 200
ReplyCode = 200
PASV
227 Entering Passive Mode (xxx,xx,xxx,xxx)   <-IP matches to the ftpHostIP!
RETR img22103106251_3.jpg
425 Rejected data connection for transfer of "/201014/img22103106251_3.jpg",IP addresses of control and data connection do not match
ERROR. File has NOT been downloaded
ReplyCode = 425
QUIT
221 Goodbye

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...