iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >Java连接服务器的两种方式SFTP和FTP有什么区别
  • 527
分享到

Java连接服务器的两种方式SFTP和FTP有什么区别

2023-07-05 06:07:55 527人浏览 泡泡鱼
摘要

这篇文章主要介绍了Java连接服务器的两种方式SFTP和FTP有什么区别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java连接服务器的两种方式SFTP和FTP有什么区别文章都会有所收获,下面我们一起来看看吧

这篇文章主要介绍了Java连接服务器的两种方式SFTP和FTP有什么区别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java连接服务器的两种方式SFTP和FTP有什么区别文章都会有所收获,下面我们一起来看看吧。

区别

FTP是一种文件传输协议,一般是为了方便数据共享的。包括一个FTP服务器和多个FTP客户端。FTP客户端通过FTP协议在服务器上下载资源。FTP客户端通过FTP协议在服务器上下载资源。而一般要使用FTP需要在服务器上安装FTP服务。

而SFTP协议是在FTP的基础上对数据进行加密,使得传输的数据相对来说更安全,但是传输的效率比FTP要低,传输速度更慢(不过现实使用当中,没有发现多大差别)。SFTP和ssh使用的是相同的22端口,因此免安装直接可以使用。

总结

一;FTP要安装,SFTP不要安装。

二;SFTP更安全,但更安全带来副作用就是的效率比FTP要低。

FtpUtil

<!--ftp文件上传--><dependency>    <groupId>commons-net</groupId>    <artifactId>commons-net</artifactId>    <version>3.6</version></dependency>
import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import java.io.*;@Componentpublic class FtpUtil {    private static final Logger logger = LoggerFactory.getLogger(FtpUtil.class);    //ftp服务器地址    @Value("${ftp.server}")    private String hostname;    //ftp服务器端口    @Value("${ftp.port}")    private int port;    //ftp登录账号    @Value("${ftp.userName}")    private String username;    //ftp登录密码    @Value("${ftp.userPassWord}")    private String password;        public FTPClient getFtpClient() {        FTPClient ftpClient = new FTPClient();        ftpClient.setControlEncoding("UTF-8");        try {            //设置连接超时时间            ftpClient.setDataTimeout(1000 * 120);            logger.info("连接FTP服务器中:" + hostname + ":" + port);            //连接ftp服务器            ftpClient.connect(hostname, port);            //登录ftp服务器            ftpClient.login(username, password);            // 是否成功登录服务器            int replyCode = ftpClient.getReplyCode();            if (FTPReply.isPositiveCompletion(replyCode)) {                logger.info("连接FTP服务器成功:" + hostname + ":" + port);            } else {                logger.error("连接FTP服务器失败:" + hostname + ":" + port);                closeFtpClient(ftpClient);            }        } catch (IOException e) {            logger.error("连接ftp服务器异常", e);        }        return ftpClient;    }        public boolean uploadFileToFtp(String pathName, String fileName, InputStream inputStream) {        boolean isSuccess = false;        FTPClient ftpClient = getFtpClient();        try {            if (ftpClient.isConnected()) {                logger.info("开始上传文件到FTP,文件名称:" + fileName);                //设置上传文件类型为二进制,否则将无法打开文件                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);                //路径切换,如果目录不存在创建目录                if (!ftpClient.changeWorkingDirectory(pathName)) {                    boolean flag = this.changeAndMakeWorkingDir(ftpClient, pathName);                    if (!flag) {                        logger.error("路径切换(创建目录)失败");                        return false;                    }                }                //设置被动模式,文件传输端口设置(如上传文件夹成功,不能上传文件,注释这行,否则报错refused:connect)                ftpClient.enterLocalPassiveMode();                ftpClient.storeFile(fileName, inputStream);                inputStream.close();                ftpClient.loGout();                isSuccess = true;                logger.info(fileName + "文件上传到FTP成功");            } else {                logger.error("FTP连接建立失败");            }        } catch (Exception e) {            logger.error(fileName + "文件上传异常", e);         } finally {            closeFtpClient(ftpClient);            closeStream(inputStream);        }        return isSuccess;    }        public boolean deleteFile(String pathName, String fileName) {        boolean flag = false;        FTPClient ftpClient = getFtpClient();        try {            logger.info("开始删除文件");            if (ftpClient.isConnected()) {                //路径切换                ftpClient.changeWorkingDirectory(pathName);                ftpClient.enterLocalPassiveMode();                ftpClient.dele(fileName);                ftpClient.logout();                flag = true;                logger.info("删除文件成功");            } else {                logger.info("删除文件失败");            }        } catch (Exception e) {            logger.error(fileName + "文件删除异常", e);        } finally {            closeFtpClient(ftpClient);        }        return flag;    }        public void closeFtpClient(FTPClient ftpClient) {        if (ftpClient.isConnected()) {            try {                ftpClient.disconnect();            } catch (IOException e) {                logger.error("关闭FTP连接异常", e);            }        }    }        public void closeStream(Closeable closeable) {        if (null != closeable) {            try {                closeable.close();            } catch (IOException e) {                logger.error("关闭文件流异常", e);            }        }    }        public void changeAndMakeWorkingDir(FTPClient ftpClient, String path) {        boolean flag = false;        try {            String[] path_array = path.split("/");            for (String s : path_array) {                boolean b = ftpClient.changeWorkingDirectory(s);                if (!b) {                    ftpClient.makeDirectory(s);                    ftpClient.changeWorkingDirectory(s);                }            }            flag = true;        } catch (IOException e) {            logger.error("路径切换异常", e);        }        return flag;    }        public boolean downloadFile(FTPClient ftpClient, String pathName, String targetFileName, String localPath) {        boolean flag = false;        OutputStream os = null;        try {            System.out.println("开始下载文件");            //切换FTP目录            ftpClient.changeWorkingDirectory(pathName);            ftpClient.enterLocalPassiveMode();            FTPFile[] ftpFiles = ftpClient.listFiles();            for (FTPFile file : ftpFiles) {                String ftpFileName = file.getName();                if (targetFileName.equalsIgnoreCase(ftpFileName)) {                    File localFile = new File(localPath + targetFileName);                    os = new FileOutputStream(localFile);                    ftpClient.retrieveFile(file.getName(), os);                    os.close();                }            }            ftpClient.logout();            flag = true;            logger.info("下载文件成功");        } catch (Exception e) {            logger.error("下载文件失败", e);        } finally {            closeFtpClient(ftpClient);            closeStream(os);        }        return flag;    }}

SFTPUtil

<dependency>    <groupId>com.jcraft</groupId>    <artifactId>jsch</artifactId>    <version>0.1.54</version></dependency>
import com.jcraft.jsch.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.InputStream;import java.util.Properties;import java.util.Vector;@Componentpublic class SFTPUtil {    private static final Logger logger = LoggerFactory.getLogger(SFTPUtil.class);    private Session session = null;    private ChannelSftp channel = null;    private int timeout = 60000;        public boolean connect(String ftpUsername, String ftpAddress, int ftpPort, String ftpPassword) {        boolean isSuccess = false;        if (channel != null) {            System.out.println("通道不为空");            return false;        }        //创建JSch对象        JSch jSch = new JSch();        try {            // 根据用户名,主机ip和端口获取一个Session对象            session = jSch.getSession(ftpUsername, ftpAddress, ftpPort);            //设置密码            session.setPassword(ftpPassword);            Properties config = new Properties();            config.put("StrictHosTKEyChecking", "no");            //为Session对象设置properties            session.setConfig(config);            //设置超时            session.setTimeout(timeout);            //通过Session建立连接            session.connect();            System.out.println("Session连接成功");            // 打开SFTP通道            channel = (ChannelSftp) session.openChannel("sftp");            // 建立SFTP通道的连接            channel.connect();            System.out.println("通道连接成功");            isSuccess = true;        } catch (JSchException e) {            logger.error("连接服务器异常", e);        }        return isSuccess;    }        public void close() {        //操作完毕后,关闭通道并退出本次会话        if (channel != null && channel.isConnected()) {            channel.disconnect();        }        if (session != null && session.isConnected()) {            session.disconnect();        }    }        public boolean upLoadFile(InputStream src, String dst, String fileName) throws SftpException {        boolean isSuccess = false;        try {            if(createDir(dst)) {                channel.put(src, fileName);                isSuccess = true;            }        } catch (SftpException e) {            logger.error(fileName + "文件上传异常", e);        }        return isSuccess;    }        public boolean createDir(String createpath) {        boolean isSuccess = false;        try {            if (isDirExist(createpath)) {                channel.cd(createpath);                return true;            }            String pathArry[] = createpath.split("/");            StringBuffer filePath = new StringBuffer("/");            for (String path : pathArry) {                if (path.equals("")) {                    continue;                }                filePath.append(path + "/");                if (isDirExist(filePath.toString())) {                    channel.cd(filePath.toString());                } else {                    // 建立目录                    channel.mkdir(filePath.toString());                    // 进入并设置为当前目录                    channel.cd(filePath.toString());                }            }            channel.cd(createpath);            isSuccess = true;        } catch (SftpException e) {            logger.error("目录创建异常!", e);        }        return isSuccess;    }        public boolean isDirExist(String directory) {        boolean isSuccess = false;        try {            SftpATTRS sftpATTRS = channel.lstat(directory);            isSuccess = true;            return sftpATTRS.isDir();        } catch (Exception e) {            if (e.getMessage().toLowerCase().equals("no such file")) {                isSuccess = false;            }        }        return isSuccess;    }        public boolean rename(String oldPath, String newPath) {        boolean isSuccess = false;        try {            channel.rename(oldPath, newPath);            isSuccess = true;        } catch (SftpException e) {            logger.error("重命名指定文件或目录异常", e);        }        return isSuccess;    }        public Vector ls(String path) {        try {            Vector vector = channel.ls(path);            return vector;        } catch (SftpException e) {            logger.error("列出指定目录下的所有文件和子目录。", e);        }        return null;    }        public boolean deleteFile(String directory, String deleteFile) {        boolean isSuccess = false;        try {            channel.cd(directory);            channel.rm(deleteFile);            isSuccess = true;        } catch (SftpException e) {            logger.error("删除文件失败", e);        }        return isSuccess;    }        public boolean download(String directory, String downloadFile, String saveFile) {        boolean isSuccess = false;        try {            channel.cd(directory);            File file = new File(saveFile);            channel.get(downloadFile, new FileOutputStream(file));            isSuccess = true;        } catch (SftpException e) {            logger.error("下载文件失败", e);        } catch (FileNotFoundException e) {            logger.error("下载文件失败", e);        }        return isSuccess;    }}

问题

文件超出默认大小

#单文件上传最大大小,默认1Mb
spring.Http.multipart.maxFileSize=100Mb
#多文件上传时最大大小,默认10Mb
spring.http.multipart.maxRequestSize=500MB

关于“Java连接服务器的两种方式SFTP和FTP有什么区别”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java连接服务器的两种方式SFTP和FTP有什么区别”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网服务器频道。

--结束END--

本文标题: Java连接服务器的两种方式SFTP和FTP有什么区别

本文链接: https://www.lsjlt.com/news/350015.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java连接服务器的两种方式SFTP和FTP有什么区别
    这篇文章主要介绍了Java连接服务器的两种方式SFTP和FTP有什么区别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java连接服务器的两种方式SFTP和FTP有什么区别文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • Java连接服务器的两种方式SFTP和FTP
    目录区别FtpUtilSFTPUtil问题区别 FTP是一种文件传输协议,一般是为了方便数据共享的。包括一个FTP服务器和多个FTP客户端。FTP客户端通过FTP协议在服务器上下载资...
    99+
    2023-02-25
    Java SFTP连接服务器 Java FTP连接服务器
  • 云服务器的种类包括什么和什么两种方式的区别
    云服务器可以分为以下几种类型: 私有云:私有云是指客户将数据托管在一个第三方的物理服务器上,以保护其隐私和机密性。这种模式的优势在于可以提供更好的灵活性,因为可以根据需要扩展服务器和增加虚拟机等服务。但是,这种模式需要客户承担一定的硬件...
    99+
    2023-10-27
    两种 种类 区别
  • 云服务器的种类包括什么和什么两种模式的区别
    云服务器(Cloud Storage)是指一种提供高可靠性、高可用性和低成本的数据存储和处理服务的服务器系统。这些服务可以包括Web应用服务器、数据库服务器、负载均衡、备份和恢复服务等。 云服务器的种类包括以下几种: Amazon We...
    99+
    2023-10-27
    两种 种类 区别
  • python连接telnet和ssh的两种方式是什么
    本篇内容主要讲解“python连接telnet和ssh的两种方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python连接telnet和ssh的两种方式是什么”吧!Telnet 连接方...
    99+
    2023-06-25
  • Go的两种声明变量的方式有什么区别
    一、变量作用域不同 使用var关键字声明变量时,变量的作用域可以是全局的或者局部的,而使用:=运算符声明变量时,变量的作用域只能是局部的。这是因为:=运算符是一种简化语法,在函数内部使用。 例如: 在上面的代码中,变量name使用va...
    99+
    2023-10-29
    两种 变量 有什么区别
  • 云服务器和云主机:连接方式和区别
    1. 云服务器和云主机的定义和区别 云服务器和云主机是云计算领域中常用的术语,它们都是指在云平台上提供的虚拟化的计算资源。虽然它们的功能和用途相似,但在一些细节上存在一些区别。 云服务器是指在云平台上提供的一种虚拟化的计算资源,它可以运行...
    99+
    2023-10-27
    区别 主机 方式
  • 云服务器的种类包括什么和什么两种类型的区别
    云服务器可以分为以下几种类型的云服务器: 公共云服务器:公共云服务器的服务提供商为多个客户提供多种服务,包括计算、存储和网络。公共云服务器是由多个服务提供商在云端提供。 私有云服务器:私有云服务器是只提供给某些特定的客户或合作伙伴,这些...
    99+
    2023-10-27
    种类 两种类型 区别
  • MySQL的内连接和外连接有什么区别
    MySQL的内连接和外连接是两种不同的查询方式。 内连接(INNER JOIN)是根据两个表之间的共同字段进行连接,并返回满足条件的...
    99+
    2024-04-09
    MySQL
  • web服务器和ftp服务器的区别是什么
    本篇内容介绍了“web服务器和ftp服务器的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是服务器?答:服务器,也称伺服器,是...
    99+
    2023-06-04
  • 云服务器的种类包括什么和什么两种方式
    云服务器可以分为以下几类: Amazon Web Services(AWS):AWS是全球最大的云服务器提供商之一,由Guido Amazon于1995年创建。AWS提供了一个公共的基础设施环境,使得企业和组织可以将其应用程序部署在AW...
    99+
    2023-10-26
    两种 种类 方式
  • ONLINE DDL INPLACE和COPY两种方式MDL锁的区别有哪些
    小编给大家分享一下ONLINE DDL INPLACE和COPY两种方式MDL锁的区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了...
    99+
    2024-04-02
  • 云服务器的用途包括什么和什么两种功能区别
    云服务器可以被用作一个灵活的资源池,可以按需分配给用户,并且可以按照用户的需求自动扩展。这意味着用户不必购买昂贵的硬件,只需要购买相应的云服务器即可。 云服务器的功能主要包括: 存储服务:云服务器可以为用户提供大量的存储空间,并且可以按...
    99+
    2023-10-28
    两种 用途 区别
  • 云服务器的用途包括什么和什么两种类型区别
    数据存储:云服务器可以为用户提供高可用的数据存储服务,用户可以在不同的云服务器之间共享数据,并且云服务器还可以自动管理数据备份和灾备,确保数据的安全性和可靠性。 资源管理:云服务器可以为用户提供灵活的资源管理功能,用户可以根据自己的需求来...
    99+
    2023-10-27
    两种类型 用途 区别
  • 云服务器的种类包括什么和什么两种方式组成
    云服务器可以分为以下几种类型: 虚拟云服务器(Virtual Cloud Server):是一种基于云计算技术的虚拟服务器,由操作系统虚拟化管理,能够在多个云计算数据中心之间移动数据。它通常由多个物理服务器组成,每个服务器运行一个应用程...
    99+
    2023-10-27
    两种 种类 方式
  • 两个云服务器之间的连接方式是什么
    两个云服务器之间的连接方式可能包括: 数据库连接:两个云服务器可以通过数据库连接建立连接,用于访问数据和执行各种操作,如创建、删除或更新数据。 文件传输:两个云服务器可以使用文件传输服务(如S3 Streaming Service或S4...
    99+
    2023-10-27
    两个 方式 服务器
  • linux的软连接和硬链接有什么区别
    Linux中的软连接(Symbolic Link)和硬链接(Hard Link)是两种不同类型的链接方式,它们有以下区别:1. 文件...
    99+
    2023-10-12
    linux
  • 云服务器的用途包括什么和什么两种方式
    云服务器是一种虚拟的数据中心基础设施,它提供了一种在云端托管数据的方式,可以根据用户的需求将数据存储、处理、分析和应用于不同的设备中。云服务器通常包括以下几种用途: 存储和备份数据:用户可以将大量的数据存储在云服务器上,以便能够在需要时...
    99+
    2023-10-27
    两种 用途 方式
  • 云服务器的种类包括什么和什么两种模式
    云服务器是一种虚拟化计算平台,它的种类和模式可以根据不同的需求和技术而有所不同。一般来说,云服务器可以分为两种类型: 裸金属云服务器:这种服务器通常采用裸金属机柜来提供高速的网络连接和存储容量。这种服务器可以在本地或者远程运行,但是不提...
    99+
    2023-10-26
    两种 种类 模式
  • Java中的抽象类和接口的两大区别分别是什么
    这篇文章给大家介绍Java中的抽象类和接口的两大区别分别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。抽象类和接口有什么区别什么情况下使用抽象类什么情况下使用接口抽象类和接口的不同:抽象函数为带有abstract...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作