使用apache commons net的代理服务器后面的FTPS客户端

时间:2012-07-09 07:27:39

标签: java ftps

我们的网络团队只允许我们通过代理服务器连接到第三方客户端 有没有办法将代理服务器添加到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)

非常感谢。

杰拉德

2 个答案:

答案 0 :(得分:1)

它可能..请看下面的链接......

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

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

例如:

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

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

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

答案 1 :(得分:0)

正如所观察到的那样,这是一个古老的话题,但答案却未得到妥善传递。

看一下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实例。