Jsch网络工具包的使用及源码简析

一、背景

最近,导师安排了些看论文文献并整理论文至文件服务器的工作,在实验的过程中,我们知道常见的上传文件至服务器有以下方式。

  • ftp/sftp协议进行上传
  • ssh连接,并通过scp命令进行上传
  • 通过xftp、xshell、ftplina等图形化工具上传

还记得大二刚学编程时,觉得采用xftp上传文件到服务器,并且能通过静态服务器nginx去访问这些静态资源,就觉得很厉害。也固化认为上传文件就得需要这工具,后面学习了计算机网络,才知道,图形化工具的本身也是通过调用底层的通信API进行交互,而交互的过程则需要协议去标准化。那么,Java这样的高级语言也肯定有相应的包去处理这网络通信,经了解,Jsch则可以满足;

二、Jsch的基本介绍

基本介绍

JSch 是 SSH2 的一个纯 Java 实现。它允许你连接到一个 sshd 服务器,使用端口转发,X11 转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。同时该项目也提供一个 J2ME 版本用来在手机上直连 SSHD 服务器。

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。

简单使用

从基本介绍,我们可以明白该包是基于ssh,估计也可以使用shell进行操作。另外是基于应用层,那么我们根据ISO模型,也大致可以去推测它的设计,可能会有session会话设计、socket进行通信,而对于IP网络、路由则无需应用程序去考虑。基于该概念,看看简单的使用。

  • 创建JSch的对象
  • 创建会话,并进行连接会话(HOST、PORT,通信的本质是进程之间的通信,可以联系JDBC、Netty等通信设计)
  • 进行验证、设置密码(可同第二步)
  • 进行请求连接、
  • 获取通道,通信的过程实则为IO的连接过程
  • 进行sftp的操作,例如get\put等,sftp协议提供的相应指令
public class SftpUtil {
    private final static String HOST = "192.168.159.144";
    private final static String USER_NAME = "root";
    private final static String PASSWORD = "123321";
    private final static Integer PORT = 22;
    
    @Test
    public void testSftp(){
      //  ChannelSf
        //ChannelSftp channelSftp = new ChannelSftp();
    
        // 1.创建对象
        JSch jSch = new JSch();
        // 2.创建会话--会话层--sftp应用层协议 向下 是会话层
        try {
            Session session = jSch.getSession(USER_NAME,HOST,PORT);
            session.setPassword(PASSWORD);
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.setTimeout(30000);
            // 分析 该方法的实现过程,如何采用socket进行通信实现
            session.connect();
            ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
            channelSftp.connect();
            System.out.println(channelSftp.lpwd());// 结合shell脚本命令--高级逻辑式编程语言+shell脚本式语言 → 联系、贯通
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }
}

简单看看源码设计

Jsch是去请求服务端,并进行连接操作,因此只设计client端的设计,而不关心服务端。

  • 整体结构
    对于端的设计:Request+Socket;Request抽象类、RequestSftp\ RequestShell等子类。
    对于消息的设计:Channel + Buffer + Packet
    对于通信的建立:Session + IO
    对于安全保证:UserAuth + Config等
    在这里插入图片描述
  • 跟踪一下过程
  1. 创建会话、配置连接信息
    在这里插入图片描述
    在会话中进行初始化了buf,packet,已经host,username等信息。而Session设计为一个线程任务(Session implements Runnable),一段会话是一次执行过程。此处未有PASSWORD的信息初试化,而是需要单独 session.setPassword(PASSWORD); ,可能是因为ssh连接时,先进行连接再进行密码认证。
    在这里插入图片描述
    其他的一些配置:设置超时、等,对于客户端,超时处理是十分必要的。也是服务保障的关键。
    在这里插入图片描述
  2. connect进行连接、通信
  • 创建socket,并进行IO的传输,至此传输层的处理结束
    在这里插入图片描述
  1. 打开channel,进行应用层的处理
  • 根据type控制参数进行创建具体的Channell。
  • 创建初始化相应的请求队列,并进行逐一请求,写入读出IO流
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

三、其他网络工具包

网络工具包

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值