首页 > 代码库 > FTPS链接服务器

FTPS链接服务器

一.首先登录ftp服务器:命令行 lftp user@ip  上传:put  下载: get 

二. 关于FTP传输模式与传输的方式

      众所周知,FTP传输有两种工作模式,Active Mode和Passive Mode(主动模式和被动模式),简单描述连接过程如下:

  1.主动模式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时, 客户端在命令链路上用PORT命令告诉服务器:“我打开了***端口,你过来连接我”。于是服务器从20端口向客户端的***端口发送连接请求,建立一条数据链路来传送数据。  

  2.被动模式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时, 服务器在命令链路上用PASV命令告诉客户端:“我打开了***端口,你过来连接我”。于是客户端向服务器的***端口发送连接请求,建立一条数据链路来传送数据。  

了解模式的目的,是为了了解端口。使用 FTP 传输时,至少会使用到两个 Port 来建立连接通道:

  • 一个为指令通道(Command Channel),默认使用 Port 21 建立,用来传输 FTP 指令,例如:列出清单(LIST)、变更目录(CWD)、取得目前的目录(PWD)、......等。

  • 另一个为数据通道(DATA Channel),默认使用 Port 20,但是会因 FTP Client 选择使用的模式不同而有所不同.

  1.ASCII传输方式

  假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。 

  但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝。

  2.二进制传输模式

  在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行

  文件到Windows系统,在对方系统上,此文件不能执行。

  如在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果

  传输二进制文件,所有的位都是重要的

三.不多做解释,上传一段FTPS的代码

public class FtpsUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(FtpsUtil.class);

    /**
     * 暴露的方法
     */
    public boolean uploadFile(InputStream in, String dirName, String remoteFileName, String adder, int port, String userName, String userPassword) {
        FTPSClient ftpClient = null;
        try {

            LOGGER.info("uploadFile addr:{},port:{},userName:{},userPassword:{}", adder, port, userName, userPassword);
            ftpClient = ftpConnection(adder, port, userName, userPassword);

            makeDirectory(ftpClient, dirName);
            ftpClient.changeWorkingDirectory(dirName);

            boolean isUploadSuccess = ftpPut(ftpClient, remoteFileName, in);
            if (isUploadSuccess) {
                return true;
            }
        } catch (Exception e) {
            LOGGER.error("上传文件失败了。。upload file Exception:", e);
        } finally {
            ftpClose(ftpClient);
        }
        return false;
    }

    private FTPSClient ftpConnection(String adder, int port, String userName, String passWord) {
        FTPSClient ftpClient = null;
        try {
            ftpClient = new FTPSClient(false);
            ftpClient.connect(adder, port);
            ftpClient.login(userName, passWord);
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.execPROT("P");
            ftpClient.enterLocalPassiveMode();
            LOGGER.info("ftpconnection success");
        } catch (Exception e) {
            LOGGER.error("ftpconnection EXception:", e);
        }
        return ftpClient;
    }

    private void makeDirectory(FTPSClient ftpClient, String dirName) {
        try {
            ftpClient.makeDirectory(dirName);
            LOGGER.info("创建文件夹成功:{}", dirName);
        } catch (Exception e) {
            LOGGER.error("目录已经存在,无需创建");
        }
    }

    private boolean ftpPut(FTPSClient ftpClient, String filename, InputStream in) throws IOException {
        try {
            boolean result = ftpClient.storeFile(filename, in);
            if (result) {
                LOGGER.info("upload file success");
            }
            return result;

        } catch (Exception ex) {
            LOGGER.error("上传文件发生异常了。。。", ex);
            return false;
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }

    private boolean ftpClose(FTPSClient ftpClient) {
        try {
            if (ftpClient != null) {
                ftpClient.logout();
                ftpClient.disconnect();
            }
            LOGGER.info("ftpClose success");
        } catch (Exception e) {
            LOGGER.error("ftpclose Exception:", e);
            return false;
        }
        return true;
    }
}

 

FTPS链接服务器