使用JSch库在Java中获取会话和SFTP通道

我正在为SFTP使用JSch库。 我需要在SFTP服务器上做几个操作,比如移动其他目录中的远程文件,拉文件等。对于所有这些操作,我需要Session然后从中获取Channel然后将其转换为ChannelSftp 。 这是多余的步骤。 所以我想把它抽象成一个private方法。

 private ChannelSftp getChannelSftp() throws JSchException { java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); JSch jsch = new JSch(); Session session; session = jsch.getSession(VENDOR1_USERID, VENDOR1_SERVER, VENDOR1_PORT); session.setPassword(VENDOR1_PASSWORD); session.setConfig(config); session.connect(); ChannelSftp channelSftp = null; Channel channel = session.openChannel("sftp"); channel.connect(); channelSftp = (ChannelSftp) channel; return channelSftp; } 

但是在SFTP操作之后,我需要断开与通道和会话的连接。 使用上面的方法,虽然我可以在调用方法中断开Channel但是我不能断开与Session连接,因为我没有可能是泄漏的实例所以我现在将它分成getSession()方法,现在ChannelSftp创建是所有方法都重复。

什么是更好的设计/重构方法

 private Session getSession() throws JSchException { java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); JSch jsch = new JSch(); Session session; session = jsch.getSession(VENDOR1_USERID, VENDOR1_SERVER, VENDOR1_PORT); session.setPassword(VENDOR1_PASSWORD); session.setConfig(config); session.connect(); return session; } 

调用方法示例:指示重复的代码

 public void sftp(File file) throws SftpException, FileNotFoundException, JSchException { Session session = getSession(); /* Duplicate code START*/ if ( session == null ) throw new SftpException(0 , "Service: Session is NULL"); ChannelSftp channelSftp = null; Channel channel = session.openChannel("sftp"); channel.connect(); channelSftp = (ChannelSftp) channel; /* Duplicate code END*/ channelSftp.cd(VENDOR1_PATH); channelSftp.put(new FileInputStream(file), file.getName()); channelSftp.disconnect(); session.disconnect(); } 

如果您经常使用SFTP会话,则不应为每个操作重新创建它。 对客户端和服务器而言,打开SSH / SFTP连接对CPU要求很高。 如果您很快就需要新的连接,那么关闭连接是非常浪费的。

因此,请考虑在“应用程序”的开头打开一个共享会话和通道,并将其重用于所有操作。


要回答你的实际会话:我将介绍另一个拥有SessionChannelSftp (使用getSession()getChannel() )并从factory方法返回。


实际上, Channel类中有getSession方法 。