微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?