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

FTP Apache Commons在retrieveFile上暂停

卫浩瀚
2023-03-14

我创建了一个小测试程序供以后使用,它只需连接到服务器并检索一个文件,如下所示:

import org.apache.commons.net.ftp.*;
import java.io.*;
import java.net.SocketException;


public class Test {
     private final String pass = [I removed this password];
        FTPClient ftp;
        File file = new File("download.txt");
        private int reply;
        FileOutputStream dfile;

        public void ftp() {
            try {
                ftp = new FTPClient();
                ftp.connect("ftp.bevilacqua.me");
                ftp.login([i removed this username] ,[I removed this password]);

                reply = ftp.getReplyCode();

                if(FTPReply.isPositiveCompletion(reply)) {
                    System.out.println("Connected Success");
                } else {
                    System.out.println("Connection unsuccessful");
                    ftp.disconnect();
                }

                if(file.exists()) {
                    System.out.println("File already exists");
                } 

                dfile = new FileOutputStream(file);


                ftp.retrieveFile("untitled.txt", dfile); //Untitled does exist in directory '/'
                System.out.println("Success... maybe");


            } catch(SocketException ex) {
                ex.printStackTrace();
            } catch(IOException ex) {
                ex.printStackTrace();
            }


        }

    public static void main(String[] args) {
        Test main = new Test();
        main.ftp();
        try {
            main.ftp.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

程序打印连接成功,文件已经存在,所以它必须是检索文件。程序不会崩溃,也不会抛出异常。

共有1个答案

茹高义
2023-03-14

我会先试试这些:

1)被动模式(这指示客户端进行所有连接,而不是服务器)ftp.enterLocalPassiveMode();

2) 数据超时(这应该可以停止不确定的挂起,但是如果你设置的值太短,那么你可以避免早期的慢速连接)很难模拟和测试——只要尝试一下。ftp。setDataTimeout(10000)//十秒钟

最终,有一种方法可以将protocolMessageHandler传递给底层套接字,这样您就可以记录客户端和服务器之间的聊天。虽然我从未这样做过,但我认为这很有可能揭示真正的问题。

 类似资料:
  • 我有一个Flink流应用程序,需要能够“暂停”和“取消暂停”对特定键控流的处理。“处理”意味着只是在流上执行一些简单的异常检测。 我们正在考虑的flow是这样工作的: 命令流,可以是ProcessCommand、PauseCommand或ResumeCommand,每个命令都有一个用于按键的id。 处理命令将检查按键在处理前是否暂停,如果没有暂停,则检查缓冲区。 暂停命令(PauseCommand

  • 暂停脚本的当前线程。 #p::Pause ; 按一次 Win+P 会暂停脚本. 再按一次则取消暂停. Pause [, On|Off|Toggle, OperateOnUnderlyingThread?] 参数 On|Off|Toggle 如果为空或省略, 则它默认为 Toggle. 否则, 请指定下列单词的其中一个: Toggle:如果在当前线程下的潜在线程处于运行状态,则暂停当前线程,否则让潜

  • 问题内容: 我在Swift中创建了一个游戏,其中涉及怪物的出现。怪物根据计时器的出现和消失如下: 然后我就这样称呼它(例如在2秒后生成): 然后,我进行了类似的隐藏操作(在x秒后,我将怪物消灭了)。 因此,我在屏幕顶部创建了一个设置图标,当您点击它时,会出现一个巨大的矩形窗口以更改游戏设置,但是自然的问题是怪物仍然在背景中生成。如果我将玩家带到另一个屏幕,我相信我会失去我所有的游戏状态,并且必须重

  • 在webview iframe和webview上播放的视频设置在回收卡视图上。许多视频都在他们的recyclerview上。 我想在用户开始滚动回收器时暂停播放视频,并在用户播放另一个视频时暂停播放视频。 查看代码 我想用这个: 请帮我解决这个问题。任何帮助都将不胜感激。谢谢!

  • 我现在正在用JavaFX制作一个游戏。我只是想知道如何才能暂停动画计时器。我按键盘上的一个键,计时器会暂停,如果再按一次,它会恢复。有可能这样做吗?提前谢了。 之后我再次尝试使用timer.stop()和timer.start(),但计时器只停止,再也不会启动。

  • 可能会有暂停应用的需求,那这里给做了一个。 实现非常简单,就是对容器的启动使用做了一个Sleep 当然还有另一种方案是将 replace 设置为 0