4

我正在尝试通过我的 java 代码连接到客户端 ftps 服务器。我正在使用 apache commons library 来做到这一点。但是,我无法这样做。谁能帮我解决这个问题。

客户端服务器使用 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 连接到服务器。

请帮忙,我遇到了这个问题。

谢谢

4

5 回答 5

0

client.connect(host,990);为什么要使用硬编码的端口号?我建议您更改此行以使用传递给您的函数/方法的端口号

由于我没有时间看你代码挂起和这一行的原因

  client.completePendingCommand();

在服务器断开它之前。我不确定您是否没有收到异常,或者您只是没有等待足够长的时间让您的代码抛出异常

于 2013-08-23T11:45:30.727 回答
0

enterRemotePassiveMode();仅用于服务器到服务器的连接,而不是客户端到服务器。删除该行。

于 2012-10-07T23:36:31.537 回答
0

为什么在 login() 之前进入被动模式?

我怀疑这可能是问题所在,因为症状是活动模式的症状,由于 FW 规则 DROP(不是 REJECT;当被拒绝时立即抛出异常,但 DROP 可能永远挂起)而无法建立连接。

PS 另外,不清楚什么是“远程”被动模式;唯一不同的是“本地”。

于 2011-04-28T21:22:50.427 回答
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()通常会非常详细地描述您做错了什么。

于 2016-02-11T14:52:37.410 回答
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());
        }

    }
于 2018-01-18T14:58:36.390 回答