2011-07-07 144 views
1

我試圖通過代理使用org.apache.commons.net.ftp.FTPClient連接到FTP服務器。很肯定的系統屬性得到正確設置按以下幾點:通過代理與Java的FTP連接

Properties props = System.getProperties(); 
props.put("ftp.proxySet", "true"); 
// dummy details 
props.put("ftp.proxyHost", "proxy.example.server"); 
props.put("ftp.proxyPort", "8080"); 

創建連接提出了一個UnknownHostException異常,我敢肯定意味着連接不使其過去的代理。

用戶憑證如何通過此連接類型傳遞給代理。

順便說一句,我可以成功創建一個URLConnection通過使用以下相同的代理;有沒有相當於Apache FTPClient的?

conn = url.openConnection(); 
String password = "username:password"; 
String encodedPassword = new String(Base64.encodeBase64(password.getBytes())); 
conn.setRequestProperty("Proxy-Authorization", encodedPassword); 
+0

我從Oracle Java文檔,命名爲FTP代理主機檢查:'ftp.proxHost'。而不是'ftp.proxyHost'。沒有'y'。我不知道爲什麼,我不能測試它,因爲我沒有ftp代理。 [Java網絡和代理](https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html) – cinqS

回答

0

我認爲你需要使用Authenticator

private static class MyAuthenticator extends Authenticator { 
    private String username; 
    private String password; 
    public MyAuthenticator(String username, String password) { 
     super(); 
     this.username = username; 
     this.password = password; 
    } 
    @Override 
    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(username, password.toCharArray()); 
    } 
} 

public static void main(String[] args) { 
    Authenticator.setDefault(new MyAuthenticator("foo", "bar")); 
    System.setProperty("...", "..."); 
} 
+1

感謝這堆。嘗試了這種方法並得到了完全相同的例外。決定嘗試它.sauronsoftware.ftp4j.FTPClient,並能夠使用其HTTPTunnelConnector成功連接。 – ceej23

+0

啊......那是因爲你的代理可能不是FTP代理,而是HTTP代理通過HTTP傳輸FTP。很好,你找到了解決方案! – MarcoS

2

怎麼樣,當你想使用代理使用FTPHTTPClient;

if(proxyHost !=null) { 
    System.out.println("Using HTTP proxy server: " + proxyHost); 
    ftp = new FTPHTTPClient(proxyHost, proxyPort, proxyUser, proxyPassword); 
} 
else { 
    ftp = new FTPClient(); 
}