FTPS client behind a proxy server using apache commons net

醉酒当歌 提交于 2019-12-08 07:42:51

问题


Our network team only allow us to connect to our third party client thru proxy server.
Is there a way to add a proxy server to FTPS client of apache commons net?
If it is not possible, can you tell a way on how to do it.

By the way here's the code that is working outside of the company network

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();
    }

even we tried to add some system property for proxyHost and 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");

error message

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)

Thank you very much.

Gerald


回答1:


Its possible..see the link below....

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

Well using Apache's common lib to access FTP using proxy server, please set the RemoteVerificationEnabled to false after creation of FTPClient object.

eg:

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

You can use java.net.Proxy class which is for Java 1.5 and above, this is used to set or unset the Proxy per connection basis

By using the java.net.ProxySelector, will determine a Proxy for each Connection.




回答2:


as observed it's an old topic but the answer was not properly delivered.

Taking a look on commons apache examples, we can find the following class that explains in details a good sort of available configurations and operations: https://commons.apache.org/proper/commons-net/examples/ftp/FTPClientExample.java

Regarding your question, the most simple and effective way to configura a proxy on FTPClient is:

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

Being necessary you can also pass the proxy user and password, as follows:

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

In case of doubts to where obtain a more recent version of commons.net, follow bellow the maven reference:

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

And remember, don't put the proxy hardcoded because you might need to run it in different locattions, create a different FTPClient instance based in the existence of some arguments.



来源:https://stackoverflow.com/questions/11390681/ftps-client-behind-a-proxy-server-using-apache-commons-net

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!