Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ftp客户端(来自apache.org)和套接字_Java_Sockets_Ftp_Apache Commons Net - Fatal编程技术网

Java ftp客户端(来自apache.org)和套接字

Java ftp客户端(来自apache.org)和套接字,java,sockets,ftp,apache-commons-net,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();

我使用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下)

正在运行:(在Windows 7下)

我有:


如何修复它?怎么了?

我猜: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();

干杯

您可以使用独立FTP客户端连接到此服务器吗?发布
telnet ftp.domain.com 21
ftp ftp.domain.com
是否允许您与服务器交互?这似乎是网络问题,您的代码很好(除了创建
fos
到eraly:-)。请尝试调用client.enterLocalPassiveMode()。在检索文件之前和client.login之后(“admin”、“secret”);我编辑了我的代码,但又收到了上一条消息(请看附件中的图片:))是否完全确定添加了client.enterLocalPassiveMode();在代码中,然后重新编译类?很抱歉问您,但是我有commons.net源代码,我可以清楚地看到,当您在本地活动模式下工作时,向服务器发出PORT命令时,会发生此错误(在图片上)?是的,我很笨。非常抱歉。好的,我有新消息)嘿,没问题。这条新消息表明了一个完全不同的问题。然而,这个信息是不正确的,具有误导性。不是RECV失败,而是PASV命令失败。例如,如果您的FTP服务器位于NAT之后,并且不知道其“真实”地址,则PASV命令可能会失败。我建议您首先使用更高级的客户端软件尝试被动模式,看看它是否有效。
client.retrieveFile("/" + filename, fos);
client.connect("ftp.domain.com");
client.login("admin", "secret");
client.enterLocalPassiveMode();