ftp客户端(来自apache.org)和socket除外

时间:2011-02-20 11:55:08

标签: java sockets ftp apache-commons-net

我使用apache.org中的库并使用java2s.com中的代码:

import org.apache.commons.net.ftp.FTPClient;
import java.io.IOException;
import java.io.FileOutputStream;

public class Main {
  public static void main(String[] args) {
    FTPClient client = new FTPClient();
    FileOutputStream fos = null;

    client.connect("ftp.domain.com");
    client.login("admin", "secret");
    client.enterLocalPassiveMode();

    String filename = "sitemap.xml";
    fos = new FileOutputStream(filename);

    client.retrieveFile("/" + filename, fos);
    fos.close();
    client.disconnect();
  }
}

我下载了库,将其移动到lib文件夹并将其重命名为cn.jar。

编译:(在Windows 7下)

javac -cp ".;lib\cn.jar" Main.java

运行:(在Windows 7下)

java -cp ".;lib\cn.jar" Main

我得到了:http://freelifer.narod.ru/some.png

如何解决?有什么问题?

1 个答案:

答案 0 :(得分:1)

我的猜测:FTP协议定义了两个连接 - 数据连接控制连接。您的示例代码成功建立了控制连接:

client.connect("ftp.domain.com");
client.login("admin", "secret");

FTPClient的默认构造函数定义应以活动模式建立数据连接(这意味着服务器将在您请求文件时尝试打开与客户端的连接)。我认为由于您的防火墙或其他一些网络问题,无法打开数据连接。数据连接在此处打开:

client.retrieveFile("/" + filename, fos);

您可以尝试被动模式,也可以再次检查网络设置。通过调用FTPClient的enterLocalPassiveMode方法进入被动模式。此方法会将PASV(或EPSV)命令发布到服务器。例如:

client.connect("ftp.domain.com");
client.login("admin", "secret");
client.enterLocalPassiveMode();

干杯!