我对Java很陌生,所以你解释的越多,我学的越多,我会问的问题就越少;)我正在尝试编写一个客户端连接到ftp.availity.com,但我不能为我的生活让客户登录。我已经尝试更改端口号(443,20等),但它们都没有在控制台日志中返回响应,它只返回超时错误。唯一可以得到一些操作的是端口21.我知道这是FTP,我认为可能是错误来自哪里,但我不知道如何纠正它,因为显然更改端口#不会纠正问题。任何帮助,将不胜感激!
这是我的代码:
import java.io.IOException;
import org.apache.commons.net.ftp.*;
public class FTPApp {
private static void showServerReply(FTPSClient ftpClient) {
String[] replies = ftpClient.getReplyStrings();
if (replies != null && replies.length > 0) {
for (String aReply : replies) {
System.out.println("SERVER: " + aReply);
}
}
}
public static void main(String[] args) {
String server = "ftp.availity.com";
int port = 21;
String user = "user";
String pass = "pass";
FTPSClient ftpClient = new FTPSClient();
try {
ftpClient.connect( server, port);
showServerReply(ftpClient);
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
System.out.println("Operation failed. Server reply code: " + replyCode);
return;
}
boolean success = ftpClient.login(user, pass);
showServerReply(ftpClient);
if (!success) {
System.out.println("Could not login to the server");
return;
} else {
System.out.println("LOGGED IN SERVER");
}
} catch (IOException ex) {
System.out.println("Oops! Something wrong happened");
ex.printStackTrace();
}
}
}
这是错误:
Oops! Something wrong happened
javax.net.ssl.SSLException: 502 SSLv23/TLSv1
at org.apache.commons.net.ftp.FTPSClient.execAUTH(FTPSClient.java:242)
at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:225)
at org.apache.commons.net.SocketClient._connect(SocketClient.java:244)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:202)
at FTPApp.main(FTPApp.java:23)
答案 0 :(得分:1)
我尝试更改端口号(443,20等),但它们都没有在控制台日志中返回响应,只返回超时错误。我唯一能采取行动的是21号港口。
哪个不是suprpise:端口443是HTTPS,它根本与FTP无关。端口20是数据端口,用作与FTP的数据连接源,但不是需要连接的端口。端口21是FTP控制端口,即这是连接实际预期的端口。
糟糕!发生了一些错事 javax.net.ssl.SSLException:502 SSLv23 / TLSv1 在org.apache.commons.net.ftp.FTPSClient.execAUTH(FTPSClient.java:242)
此处使用的命令是AUTH TLS
,客户端使用该命令将普通FTP连接(如端口21上所需)升级到FTPS,即FTP over TLS。它与STARTTLS类似,可通过TLS将纯SMTP连接升级到SMTP。
AUTH TLS
期望服务器成功获得响应代码。相反,它获得代码502代表"命令未实现"。这只是意味着您与之通信的FTP服务器不支持FTP over TLS,并且您无法从客户端执行此任务。
如果您可以控制服务器,则需要配置服务器以获得TLS支持。如果您无法控制服务器,则可以使用普通的不受保护的FTP(即不是FTPSClient
但FTPClient
)或放弃。
我对Java很新...
这些都不需要任何Java知识。它只需要了解FTP和FTPS如何工作。
答案 1 :(得分:0)
在这里添加我的评论,因为我没有足够的声誉(最近加入了stackoverflow :)。 从错误看,它似乎是SSL / TLS协商的问题,导致502返回代码。您可以将-Djavax.net.debug = all添加为jvm属性,以调试有关确切SSL协商问题的更多信息。
答案 2 :(得分:0)
我想出来了!
ftp.availity.com是我要去登录的网址,但是当把它放到主机上时,为了保证安全,我所要做的只是保留“FTPSClient”,但让主机“ ftps .availity.com“不仅仅是”ftp.availity.com“。
ftp服务器是在Axway SecureTransport或Tumbleweed下设置的,所以希望任何有相同问题的人都可以找到这个帖子!
非常感谢你帮助我!