jsch-channelSftp相关问题汇总

本文详细介绍了如何使用JSCH库实现SFTP文件下载,并结合Hutool发送带有附件的邮件。涉及到的关键技术包括JSCH连接SFTP,ChannelSftp的get方法,以及Socket与IO流的交互。同时,文章探讨了Session线程的创建以及邮件服务器配置等核心步骤。
摘要由CSDN通过智能技术生成

简单demo实现文件下载以及将文件作为邮件附件进行发送

涉及的maven版本

<dependency>
	<groupId>com.jcraft</groupId>
	<artifactId>jsch</artifactId>
	<version>0.1.55</version>
</dependency>
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-io</artifactId>
	<version>1.3.2</version>
</dependency>
<dependency>
	<groupId>com.sun.mail</groupId>
	<artifactId>javax.mail</artifactId>
	<version>1.6.2</version>
</dependency>

测试代码

public class DownFileDemo {

    public static void main(String[] args) {
        try {
            JSch jsch = new JSch();
            Session sshSession = jsch.getSession("root", "ip地址", 22);
            sshSession.setPassword("密码");
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect(15000);
            ChannelSftp channel = (ChannelSftp) sshSession.openChannel("sftp");
            channel.connect(15000);
            File file = new File("download.pdf");
            OutputStream outputStream = new FileOutputStream(file);
            channel.get("/test/pdf/register.pdf", outputStream);
            MailUtil.send("xxx@163.com", "测试数据","测试jsch ",false,file);
            outputStream.close();
            channel.disconnect();
            sshSession.disconnect();
        }
        catch (Exception e){
            System.out.println(e);
        }
    }

}

hutool发送邮箱配置

# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
# host = smtp.yeah.net
# 邮件服务器的SMTP端口,可选,默认25  qq必须 465端口
port = 465
# 发件人(必须正确,否则发送失败)
from = xxx@qq.com
# 用户名,默认为发件人邮箱前缀
# user = yichen
# 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助)
pass = aslkhexevrmibfcg
# 使用SSL安全连接  ==>  qq必须开启
sslEnable = true

在这里插入图片描述

运行结果截图

在这里插入图片描述
在这里插入图片描述

为什么 channel.get 能读取远程文件并写入到 outputStream

具体问题描述

我之前一直很好奇,channel 为什么能读取到我远程服务器上的文件流,然后写入outputStream中。
代码 channel.get("/test/pdf/register.pdf", outputStream); 跟踪进去就直接从 io_in 里面读取数据流了,问题是这个流是哪里写入的。理论上来说肯定是从 io.outputStream 写入的,但是我找了好久都没找到。然后这个outputStream 里的数据又是从哪里来的呢?理论上来说肯定源于远程服务器上的文件,那是怎么获取的呢,看代码是通过socket获取的。所以socketio.outputStream肯定有关系,但是我没找到。。

socket的创建

Session#connect方法,
在这里插入图片描述

ChannelSftp中 io属性的创建

1、入口 ChannelSftp channel = (ChannelSftp) sshSession.openChannel("sftp");
2、创建实例 Channel channel=Channel.getChannel(type); Session-864行
3、io创建, ChannelSftp 的父类(ChannelSession)构造函数 io=new IO();
在这里插入图片描述

socket的inputStream 怎么同 io的outputStream 关联起来的

Session#run() 方法实现,第1386行
1、从socket中读取数据流,1403行
在这里插入图片描述

2、写入io.outputStram中,1459行
在这里插入图片描述

Session 作为线程是谁创建的

sshSession.connect(15000); 这个方法执行时创建的 第530行
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值