我们的网络团队只允许我们通过代理服务器连接到第三方客户端 有没有办法将代理服务器添加到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)
非常感谢。
杰拉德
答案 0 :(得分:1)
它可能..请看下面的链接......
使用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实例。