我正在尝试通过我的java代码连接到客户端ftps服务器。我正在使用apache commons库这样做。但是,我无法这样做。任何人都可以帮助我。
客户端服务器使用FTPS /隐式SSL连接,并使用被动模式进行数据连接。
我的代码如下:
public static void connectServer(String host, int port, String userName, String password) throws Exception {
FTPSClient client = new FTPSClient("SSL", true);
String remote = "Contact.xml";
File inFile = new File("C:/Documents/Applications/Contact.xml");
File outFile = new File("C:/Documents/Applications/Sample.xml");
InputStream input = new FileInputStream(inFile);
InputStream out = new FileInputStream(outFile);
try {
if(client.isConnected()){
client.disconnect();
}
client.connect(host,990);
client.enterLocalPassiveMode();
client.enterRemotePassiveMode();
client.login(userName, password);
client.setBufferSize((int)inFile.length()+100);
client.completePendingCommand();
System.out.println(client.printWorkingDirectory());
System.out.println(inFile.getAbsolutePath());
client.storeFile(remote, input);
out = client.retrieveFileStream("/folder/inputfeed.xml");
client.completePendingCommand();
client.logout();
} catch (Exception e) {
e.printStackTrace();
System.err.println(client.getReplyString());
} finally {
out.close();
input.close();
client.disconnect();
}
}
此代码不会抛出任何异常,但我没有看到文件被复制到服务器,也没有任何数据被复制到我的InputStream。此外,获取工作目录的sysout语句返回正确的目录。我也可以通过Filezilla和WinSCP连接到服务器。
请帮助,我对此感到困惑。
由于
答案 0 :(得分:0)
为什么在登录前会进入被动模式()?
我怀疑这可能是问题,因为症状是主动模式的症状,由于FW规则DROP(不是REJECT;当被拒绝时立即抛出异常,但DROP可以永久挂起),无法建立连接
P.S。另外,不清楚什么是“远程”被动模式;唯一有所作为的是“本地”。
答案 1 :(得分:0)
enterRemotePassiveMode();
仅用于服务器到服务器的连接,而不是客户端到服务器。删除该行。
答案 2 :(得分:0)
client.connect(host,990);
为什么使用硬编码端口号?我建议你改变这一行,使用传递给你的函数/方法
由于我没有时间看你的原因,代码挂起和这一行
client.completePendingCommand();
在服务器断开连接之前。我不确定你是否没有得到异常,或者你只是没有等待足够长的代码来抛出异常
答案 3 :(得分:0)
您需要在每个client(socket)
方法后检查状态。
特别是在client.connect()
和client.login()
之后。
示例:
client.connect(host, 990);
System.out.print(client.getReplyString());
...
client.login(username,password);
System.out.print(client.getReplyString());
如果方法失败(错误),getReplyString()
通常会非常描述你做错了什么。
答案 4 :(得分:0)
您用于FTP的端口号 - 21和 对于SFTP是22
我有一些相同的要求,从不同的服务器下载文件,所以有时我不得不使用21和一些时间22。
我尝试了下面的方法
FTPClient ftpClient = new FTPClient();
int port = 21;
try {
try{
ftpClient.connect(serverName, port);
}catch(Exception e){
ftpClient.connect(serverName, 22);
}
try {
ftpClient.login(user, pass);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.changeWorkingDirectory(workingDir);
String fileName = "fileToDownLoad";
File downloadFile = new File(fileName);
OutputStream localOutputStream = new BufferedOutputStream(
new FileOutputStream(downloadFile));
InputStream fptInputStream = ftpClient.retrieveFileStream(folder
+ "/" + file);
byte[] bytesArray = new byte[4096];
int bytesRead = -1;
while ((bytesRead = fptInputStream.read(bytesArray)) != -1) {
localOutputStream.write(bytesArray, 0, bytesRead);
}
boolean success = ftpClient.completePendingCommand();
if (success) {
}
localOutputStream.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}