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

Java连接服务器的两种方式SFTP和FTP

JavaSFTP连接服务器JavaFTP连接服务器 2023-02-25 11:02:57 645人浏览 薄情痞子
摘要

目录区别FtpUtilSFTPUtil问题区别 FTP是一种文件传输协议,一般是为了方便数据共享的。包括一个FTP服务器和多个FTP客户端。FTP客户端通过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.*;
@Component
public 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;
@Component
public 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/197497.html(转载时请注明来源链接)

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

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

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

下载Word文档
猜你喜欢
  • Java连接服务器的两种方式SFTP和FTP
    目录区别FtpUtilSFTPUtil问题区别 FTP是一种文件传输协议,一般是为了方便数据共享的。包括一个FTP服务器和多个FTP客户端。FTP客户端通过FTP协议在服务器上下载资...
    99+
    2023-02-25
    Java SFTP连接服务器 Java FTP连接服务器
  • Java连接服务器的两种方式SFTP和FTP有什么区别
    这篇文章主要介绍了Java连接服务器的两种方式SFTP和FTP有什么区别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java连接服务器的两种方式SFTP和FTP有什么区别文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • 详解python连接telnet和ssh的两种方式
    目录Telnet 连接方式ssh连接方式Telnet 连接方式 #!/usr/bin/env python # coding=utf-8 import time import...
    99+
    2022-11-12
  • 数据库连接超时java处理的两种方式
    目录数据库连接超时java处理的方式1.使用socket的方式设置连接超时(通用)2.使用DriverManager.setLoginTimeout()方法来设置超时java的远程数...
    99+
    2023-05-15
    数据库连接超时 java处理超时 java数据库连接超时
  • python连接telnet和ssh的两种方式是什么
    本篇内容主要讲解“python连接telnet和ssh的两种方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python连接telnet和ssh的两种方式是什么”吧!Telnet 连接方...
    99+
    2023-06-25
  • 两个云服务器之间的连接方式
    两个云服务器之间的连接方式可以根据云服务提供商的不同而有所不同。以下是一些常见的云服务器配置和连接方式: 公共云(Public Cloud) 公共云提供商通常会提供两种类型的服务器:集群服务器和分布式服务器。其中,集群服务器负责处理大...
    99+
    2023-10-26
    两个 方式 服务器
  • MySQL数据库的两种连接方式:TCP/IP和Socket
    Linux平台环境下主要有两种连接方式,一种是TCP/IP连接方式,另一种就是socket连接。 在Windows平台下,有name pipe和share memory(不考虑)两种。 TCP/IP连接是网络中用得最多的一种方式...
    99+
    2017-12-06
    MySQL数据库的两种连接方式:TCP/IP和Socket
  • 两个云服务器之间的连接方式是
    两个云服务器之间的连接方式可以采用以下几种方式: VPN连接:使用VPN连接可以确保云服务器不受第三方服务提供商的干扰,可以在不同地理位置和网络环境下使用多个云服务器。使用VPN连接需要购买相应的服务,并且需要一定的技术知识和设备资源。...
    99+
    2023-10-27
    两个 方式 服务器
  • python连接FTP服务器的实现方法
    python中ftplib模块支持ftp操作,主要使用FTP类。本文使用ftp操作进行连接FTP服务器、获取当前目录文件清单、上传文件等操作。 参考文献1的示例中,在创建FTP实例时...
    99+
    2022-11-11
  • 两个云服务器之间的连接方式是什么
    两个云服务器之间的连接方式可能包括: 数据库连接:两个云服务器可以通过数据库连接建立连接,用于访问数据和执行各种操作,如创建、删除或更新数据。 文件传输:两个云服务器可以使用文件传输服务(如S3 Streaming Service或S4...
    99+
    2023-10-27
    两个 方式 服务器
  • 两个云服务器之间的连接方式有哪些
    云服务器的连接方式有很多,以下是一些常见的连接方式: WAN连接 通过路由器或者网关连接到云服务器的WAN端口,可以实现云服务器与其他云服务提供商之间的连接。这种连接方式适用于不同的云服务提供商,但对于一些大型的云服务提供商来说,这种...
    99+
    2023-10-28
    两个 方式 服务器
  • 远程连接阿里云服务器的几种方式
    1. SSH(Secure Shell) SSH 是一种加密的网络协议,用于在不安全的网络中安全地进行远程登录和执行命令。通过 SSH,您可以通过命令行界面(CLI)远程连接到阿里云服务器。 使用 SSH 连接阿里云服务器的步骤如下: -...
    99+
    2023-10-28
    阿里 几种 方式
  • 远程连接云服务器有哪几种方式?
    远程连接云服务器有几种方式可以实现: VPN:VPN是一种网络通信协议,用于在互联网上连接远程计算机,以防止未经授权的访问或控制。VPN适用于需要经常在不同地点之间移动的工作环境。 SSH:SSH(Secure Socket Layer...
    99+
    2023-10-26
    几种 方式 服务器
  • 远程连接云服务器ecs有几种方式
    远程连接云服务器ECS通常可以有以下几种方式: HTTP/1.1或1.2版:HTTP是一种简单的HTTP服务器端脚本,适用于连接到公共云服务器。1.1版是第一次出现,提供了更加安全的安全连接,但是速度较慢。 HTTP/0.9或0.10版...
    99+
    2023-10-26
    几种 方式 服务器
  • 远程连接云服务器ecs有哪种方式
    远程连接云服务器ECS通常可以采用以下几种方式: DHCP服务器:这是一种自动获取云服务器的主机IP地址和远程端口映射的技术。当主机在同一台云服务器上时,它能够自动分配一个IP地址,并将远程端口映射为本地端口。这样,主机即使不在同一个地...
    99+
    2023-10-27
    哪种 方式 服务器
  • 远程连接云服务器有哪几种方式
    远程连接云服务器有几种方式: 虚拟专用网络(VPN):使用VPN连接到云服务器,可以提供更高的安全性和保密性,但是需要购买特定的服务。 私有VPN:使用公共VPN服务器进行连接,但是需要特定的服务,如域名解析服务器和IP地址转换服务。 ...
    99+
    2023-10-26
    几种 方式 服务器
  • 云服务器的种类包括什么和什么两种方式
    云服务器可以分为以下几类: Amazon Web Services(AWS):AWS是全球最大的云服务器提供商之一,由Guido Amazon于1995年创建。AWS提供了一个公共的基础设施环境,使得企业和组织可以将其应用程序部署在AW...
    99+
    2023-10-26
    两种 种类 方式
  • 远程连接云服务器ESC的几种方式设置
    1. 使用SSH连接 SSH(Secure Shell)是一种加密的网络协议,可以通过终端或SSH客户端远程连接到云服务器ESC。以下是使用SSH连接的步骤: 获取云服务器的公网IP地址。 打开终端或SSH客户端,并输入以下命令: s...
    99+
    2023-10-27
    几种 方式 服务器
  • 两个云服务器之间的连接方法
    以下是两个云服务器之间的主要通信方法: DNS解析:将请求发送到对应的云服务器上。 HTTP:客户端向服务器提出请求,服务器返回响应。 GET和POST:发送请求并接收响应。 CONNECT命令:向服务器发送指令,例如"GET http...
    99+
    2023-10-26
    两个 服务器 方法
  • Linux服务器上安装Python3的两种方式
    第一种方式 阿里云、百度云服务器可用!!! yum install python3 第二种方式 1.下载python3.6.5的压缩包 wget http://cdn.npm.taobao.org/dist/python...
    99+
    2022-06-04
    Linux服务器上 linux 安装Python3
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作