【问题标题】:How to fix exception of FTPClient?如何修复 FTPClient 异常?
【发布时间】:2011-12-24 15:11:36
【问题描述】:

我正在制作一个 Android 应用程序,它可以使用 FTPClient 将文件从服务器复制到 SDCard。我使用 apache commons 库中的 FTPClient 类。但是服务器包含 1000 多个文件,当我尝试从服务器获取文件名时,我得到 SocketException:“连接已重置”(此时我有 25 个文件名)。库的版本是 3.0.1。我该如何解决?

递归获取文件的功能:

private void getFileNames(String directory, FTPClient client) throws IOException {

    Log.e("directory", "*"+directory+"**********");
    client.changeWorkingDirectory(directory);
    FTPFile[] files=client.listFiles();
    for (FTPFile file:files) {
        client.changeWorkingDirectory(directory);
        if (file.isFile()) {
            ++i;
            Log.e("file", file.getName());
            Toast.makeText(this, String.valueOf(file.getName()), Toast.LENGTH_SHORT).show();
        }
        else {

            if (file.isDirectory()&&(!file.getName().equals("."))&&(!file.getName().equals(".."))) {

                //Log.e("1", file.getLink());
                getFileNames(file.getName(), client);
            }
        }
    }

    Log.e("directory", "**********");
}

制作FTPClient的代码:

   FTPClient client=new FTPClient();
    try {
            client.connect(InetAddress.getByName("ftptestsite.com"));
        boolean result=client.login("ftptest1", "bEWw9eZR");
        //client.completePendingCommand();
        //client.enterLocalPassiveMode();
        client.setDataTimeout(Integer.MAX_VALUE);
        i=0;
        getFileNames("Power Serve", client);
        button.setText(String.valueOf(i));
        //Log.e("size", String.valueOf(client.listFiles("Power_Serve").length));
        //getFileNames(client.listFiles("Power Serve"));
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("SocketException", e.getMessage());
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            Log.e("UnknownHostException", e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("IOException", e.getMessage());
        }

【问题讨论】:

  • 请出示代码。
  • 我已经修改了代码,请检查。
  • hm,也许你可以为 ftpclient 对象设置套接字超时
  • 我试过了,还是不行

标签: java android ftp-client apache-commons-net


【解决方案1】:

尝试删除递归并测试是否适用于一个目录。我不确定你是否可以这样使用FTPClient

顺便说一句,在递归调用中,您传递了一个文件名,changeWorkingDirectory() 将不起作用。您还应该从循环中删除client.changeWorkingDirectory(directory);。在循环之前执行一次就足够了。

【讨论】:

  • 请告诉我 - 我怎样才能修复我的代码以显示文件树?我的代码不起作用,我没看到。
  • 我已经提出了您的建议,现在应用程序可以运行更长时间,但仍然会产生 SocketException
  • @user1078760:通过添加 ProtocolCommandListener:client.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); 打开详细日志记录。也许你看到了那里的问题。
猜你喜欢
  • 2012-05-29
  • 2012-10-19
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
相关资源
最近更新 更多