栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JSch进行sftp文件上传下载实践

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JSch进行sftp文件上传下载实践

JSch进行sftp文件上传下载

最近使用JSch进行sftp文件上传下载,直接在官网找到样例使用,但在并发情景下并不理想,分析代码,发现每次都会新建session,代码如下:

JSch jsch = new JSch();
session = jsch.getSession(username, serverIp, serverPort);
session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();

查看connect()方法,发现每次都会新建socket连接,如下:

socket=Util.createSocket(host, port, connectTimeout);
in=socket.getInputStream();
out=socket.getOutputStream();

正如上面展示的,每次上传文件都会新建socket连接,这是极大的资源浪费,修改代码维护session,做到session复用,在类中添加session属性,添加如下方法:

private String ip;
private int port;
private String password;
private String username;
private Session session = null;

public void connect() throws JSchException {
        try {
            if (session == null || !session.isConnected()) {
                synchronized (this) {
                    if (session == null || !session.isConnected()) {
                        JSch jsch = new JSch();
                        session = jsch.getSession(username, ip, port);
                        session.setPassword(password);
                        Properties config = new Properties();
                        config.put("StrictHostKeyChecking", "no");
                        session.setConfig(config);
                        session.connect();
                    }
                }
            }
        } catch (JSchException e) {
            throw e;
        }
    }


    public void disconnect() {
        if (this.session != null) {
            if (this.session.isConnected()) {
                this.session.disconnect();
                if (log.isInfoEnabled()) {
                    log.info("session is closed");
                }
            }
        }
    }

编写上传下载方法时复用同一个session,示例如下:

public void upload(String path, String fileName, InputStream input) throws SftpException, JSchException {
        ChannelSftp sftp;
        try {
            sftp = (ChannelSftp) session.openChannel("sftp")
            sftp.connect();
        } catch (JSchException e) {
            throw e;
        }
        try {
            if (sftp.ls(path) == null) {
                sftp.mkdir(path);
            }
            sftp.cd(path);
        } catch (SftpException e) {
            sftp.mkdir(path);
            sftp.cd(path);
        }
        try {
            sftp.put(input, fileName);
        } catch (Exception e) {
            throw e;
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (Exception e) {
                    log.error("input close fail",e);
                }
            }
            if (sftp != null) {
                if (sftp.isConnected()) {
                    sftp.disconnect();
                    log.info("sftp disconnect");
                }
            }
        }
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684798.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号