当前位置: 首页 > 知识库问答 >
问题:

apache commons net ftpClient 425无法打开被动连接:无法分配请求的地址

范轶
2023-03-14

我正在使用FTP客户端ApacheCommonsNet,当我尝试从服务器下载许多文件时,收到了这条消息。

227 Entering Passive Mode (192,168,6,101,13,102)
RETR /mnt/hda/data/2013_05_15_20_50.edy
150 Opening BINARY mode data connection for '/mnt/hda/data/2013_05_15_20_50.edy' (15877 bytes).
226 Transfer complete.

TYPE I
200 Type set to I.
PASV
425 Can't open passive connection: Cannot assign requested address.

第一个文件没有问题,但对于下一个文件,我得到“425无法打开被动连接:无法分配请求的地址”错误。

我注意到,当我尝试下载时,使用filezilla连接会丢失一段时间,但filezilla会自动重新连接。

有没有办法检查当前连接的状态?我使用下一个代码:

/**
 * Download encrypted and configuration files.
 * 
 * @throws SocketException
 * @throws IOException
 */
public void downloadDataFiles(String destDir) throws SocketException,
        IOException {

    String filename;
    log.debug("ftpServer: "  + ftpServer);
    this.ftpClient.connect(ftpServer);
    this.ftpClient.login(ftpUser, ftpPass);
    ftpClient.setControlKeepAliveTimeout(30000); // set timeout to 5 minutes

    /* CHECK NEXT 4 Methods (included the commented) 
    *  they were very useful for me!
    *  and icreases the buffer apparently solve the problem!!
    */
    ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));
    //log.debug("Buffer Size:" + ftpClient.getBufferSize());
    this.ftpClient.setBufferSize(1024 * 1024);
    //log.debug("Buffer Size:" + ftpClient.getBufferSize());


    /*  
     *  get Files to download
     */
    this.ftpClient.enterLocalPassiveMode();
    this.ftpClient.setAutodetectUTF8(true);
    this.ftpClient.enterLocalPassiveMode();
    FTPFile[] ftpFiles = ftpClient
            .listFiles(DefaultValuesGenerator.LINPAC_ENC_DIRPATH);

    /*
     * Download files
     */
    for (FTPFile ftpFile : ftpFiles) {

        // Check if FTPFile is a regular file           
        if (ftpFile.getType() == FTPFile.FILE_TYPE) {
            try{

            filename = ftpFile.getName();

            // Download file from FTP server and save
            fos = new FileOutputStream(destDir + filename);

            this.ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            //TODO: check if connection still alive.
            ftpClient.setControlKeepAliveTimeout(30000); // set timeout to 5 minutes

            //download Files 
            ftpClient.retrieveFile(
                    DefaultValuesGenerator.LINPAC_ENC_DIRPATH + filename,
                    fos
                    );


            }finally{
                fos.flush();
                fos.close();                }
        }
    }
    if (fos != null) {
        fos.close();
    }
}

共有1个答案

云锦
2023-03-14

(由OP在问题编辑中回答。转换为社区wiki答案。请参阅没有答案的问题,但问题已在评论中解决(或在聊天中扩展))

OP写道:

这不是非常优雅的解决方案,但它对我有效。我注意到这是下载文件之间的连接问题,我在425错误消息的情况下重新连接,并尝试重试下载文件(因为这个原因i=i-2;)

/**
 * Download encrypted and configuration files.
 * 
 * @throws SocketException
 * @throws IOException
 */
public void downloadDataFiles(String destDir) throws SocketException,
        IOException {

    String filename;
    //  log.debug("ftpServer: "  + ftpServer);
    this.ftpClient.connect(ftpServer);
    this.ftpClient.login(ftpUser, ftpPass);
    ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes
    ftpClient.setDataTimeout(300);

    /* CHECK NEXT 4 Methods (included the commented) 
    *  they were very useful for me!
    *  and icreases the buffer apparently solve the problem!!
    */
    //  ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));
    //log.debug("Buffer Size:" + ftpClient.getBufferSize());
    this.ftpClient.setBufferSize(1024 * 1024);
    //log.debug("Buffer Size:" + ftpClient.getBufferSize());


    /*  
     *  get Files to download
     */
    this.ftpClient.enterLocalPassiveMode();
    this.ftpClient.setAutodetectUTF8(true);
    this.ftpClient.enterLocalPassiveMode();
    FTPFile[] ftpFiles = ftpClient
            .listFiles(DefaultValuesGenerator.LINPAC_ENC_DIRPATH);

    /*
     * Download files
     */

    for (int i=0; i<ftpFiles.length;i++) {
        log.debug("INICIO i value: "+ i);
        FTPFile ftpFile =  ftpFiles[i];
        // Check if FTPFile is a regular file
        log.debug("INICIO i value: "+ i + " - file: " + ftpFile.getName());
        if (ftpFile.getType() == FTPFile.FILE_TYPE) {
            try{

            filename = ftpFile.getName();

            // Download file from FTP server and save
            fos = new FileOutputStream(destDir + filename);

            this.ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            //TODO: check if connection still alive.
            //log.debug("passive: "+ftpClient.getPassiveHost() + ":"+ ftpClient.getPassivePort()); 
                            //               
            //download Files 
            ftpClient.retrieveFile(
                    DefaultValuesGenerator.LINPAC_ENC_DIRPATH + filename,
                    fos
                    );


            log.debug("RUN i value: "+ i);
            if(ftpClient.getReplyCode() == 425){
                log.debug("REPLY CODE: "+ftpClient.getReplyCode());
                log.debug("ARCHIVO: "+ filename);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


                this.ftpClient.disconnect();
            }

            }catch(FTPConnectionClosedException e){
                log.debug("FTPConnectionClosedException");
            }catch(CopyStreamException e){
                log.debug("CopyStreamException ");
            }catch(IOException e){
                log.debug("IOException - reconecting to server");

                this.ftpClient.connect(ftpServer);
                this.ftpClient.login(ftpUser, ftpPass);
                this.ftpClient.enterLocalPassiveMode();

                i=i-2; //para poder volver a intentar descargar el archivo
                log.debug("Exception i value: "+ i);

            }finally{
                fos.flush();
                fos.close();                }
        }
    }
    if (fos != null) {
        fos.close();
    }
}
 类似资料:
  • 问题内容: 我想在我的应用程序中使用低端口(Spring Web上的SNMP陷阱接收器+ Tomcat7)。正如我之前在此线程将低端口绑定到Ubuntu Server上的Java程序中所告诉的那样,我收到了错误权限被拒绝。然后,我将tomcat7用户组更改为root。但是之后,我得到了java.net.BindException:无法分配请求的地址错误。对于我尝试的每个端口(低端口或高端口),我总

  • 我想在我的应用程序中使用低端口(SpringwebTomcat7上的SNMP陷阱接收器)。正如我之前在Ubuntu服务器上的这个线程Binding Low Port to Java Program中所说的,我得到了一个错误Permission denied。然后我将tomcat7用户组更改为root。但在那之后,我得到了java.net。BindException:无法分配请求的地址错误。对于我尝

  • 问题内容: 设置:我有一个虚拟机,并且在虚拟机中运行三个容器(一个Nginx代理,一个非常简单的Flask应用程序和Redis)。烧瓶应在5000端口上使用,而Redis应在6379上使用。 这些容器中的每个容器都可以独立运行,并且运行良好,也可以通过docker compose as a service来使用 。 在flask应用程序中,我的目标是连接到Redis并查询一些密钥。 Nginx容器

  • 问题内容: 当我尝试设置套接字服务器时,出现错误消息: 整个代码是最简单的: 我100%确定端口已转发,Windows防火墙已关闭。什么都不会阻塞端口9999。还有什么会出错? 问题答案: 正如其他人指出的那样,这很可能与使用port的另一个进程有关。在Windows上,运行以下命令: 并且它应该列出任何阻塞端口的内容。当然,您必须去手动在Task Manager中杀死那些程序。如果仍然无法解决问

  • 我想发送和接收数据报套接字,但遇到了异常。我传递了要通信的服务器的正确IP地址和正确的端口号。 请帮帮我。

  • 我正在使用 GNetLib 在我的计算机上测试我的服务器。每当我使用我的网络的IP时,它都不会让我绑定。 我的主机是“76 . 5 . 43 . 21”//没有张贴我的实际IP,但你得到了要点。端口是43594,我已经用canyouseeme.org测试了连接,它显示成功。 以下是完整的错误: 问题是我使用家庭网络的IP,还是库限制了我可以使用的IP?