1

我们的网络团队只允许我们通过代理服务器连接到我们的第三方客户端。
有没有办法将代理服务器添加到 apache commons net 的 FTPS 客户端?
如果不可能,你能告诉一个方法如何做到这一点。

顺便说一下,这是在公司网络之外工作的代码

String server = "ftp.xxxx.com";
    String username = "username";
    String password = "password";
    String remoteFile = "xmlSR.xml";
    String localFile = "c:/downloadedfile.xml";
    String protocol = "TLS"; // TLS / SSL
    int timeoutInMillis = 3000;
    boolean isImpicit = false;

    FTPSClient client = new FTPSClient(protocol, isImpicit);
    client.enterLocalActiveMode();
    client.setRemoteVerificationEnabled(false);
    client.setActivePortRange(50000, 50200);
    client.setDataTimeout(timeoutInMillis);
    client.addProtocolCommandListener(new PrintCommandListener(
            new PrintWriter(System.out)));
    client.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());

    try {
        int reply;

        client.connect(server);

        client.login(username, password);
        client.setFileType(FTP.BINARY_FILE_TYPE);

        client.execPBSZ(0);
        client.execPROT("P");

        System.out.println("Connected to " + server + ".");

        reply = client.getReplyCode();

        if (!FTPReply.isPositiveCompletion(reply)) {
            client.disconnect();
            System.err.println("FTP server refused connection.");
            System.exit(1);
        }

        client.listFiles();

        boolean retrieved = client.retrieveFile(remoteFile,
                new FileOutputStream(localFile));

    } catch (Exception e) {

        if (client.isConnected()) {
            try {
                client.disconnect();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        System.err.println("Could not connect to server.");
        e.printStackTrace();
        return;
    } finally {
        System.out.println("# client disconnected");
        client.disconnect();
    }

甚至我们尝试为 proxyHost 和 proxyPort 添加一些系统属性

System.setProperty("http.proxyPort", "80");
System.setProperty("http.proxyHost", "yyyy.com");
System.setProperty("ftp.proxyPort", "80");
System.setProperty("ftp.proxyHost", "yyyy.com");
System.setProperty("socksProxyPort", "80");
System.setProperty("socksProxyHost", "yyyy.com");

错误信息

Could not connect to server.
java.net.UnknownHostException: ftp.xxxx.com
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:849)
at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1202)
at java.net.InetAddress.getAllByName0(InetAddress.java:1153)
at java.net.InetAddress.getAllByName(InetAddress.java:1083)
at java.net.InetAddress.getAllByName(InetAddress.java:1019)
at java.net.InetAddress.getByName(InetAddress.java:969)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:192)# client disconnected

at org.apache.commons.net.SocketClient.connect(SocketClient.java:285)
at com.ti.itg.peit.bom.TestingApache.main(TestingApache.java:44)

非常感谢。

杰拉德

4

2 回答 2

0

它可能..请参阅下面的链接....

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/net/ProxySelector.java

使用 Apache 的公共库通过代理服务器访问 FTP,请RemoteVerificationEnabled在创建 FTPClient 对象后将其设置为 false。

例如:

FTPClient fc = new FTPClient();  
fc.setRemoteVerificationEnabled(false);  

您可以使用java.net.ProxyJava 1.5 及更高版本的类,用于设置或取消设置每个连接的代理

通过使用java.net.ProxySelector, 将为每个连接确定一个代理。

于 2012-07-09T10:02:38.560 回答
-1

正如所观察到的,这是一个老话题,但没有正确提供答案。

查看 commons apache 示例,我们可以找到以下类,它详细解释了一种很好的可用配置和操作:https ://commons.apache.org/proper/commons-net/examples/ftp/FTPClientExample.java

关于您的问题,在 FTPClient 上配置代理的最简单有效的方法是:

FTPClient ftp = new FTPHTTPClient("proxyHost", 8080);

如有必要,您还可以传递代理用户和密码,如下所示:

FTPClient ftp = new FTPHTTPClient("proxyHost", 8080, "proxyUser", "proxyPass");

如果对从何处获取最新版本的 commons.net 有疑问,请遵循以下 maven 参考:

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.5</version>
</dependency>

请记住,不要将代理硬编码,因为您可能需要在不同的位置运行它,根据某些参数的存在创建不同的 FTPClient 实例。

于 2016-11-27T13:55:38.687 回答