在项目当中,我用到了Jsch去服务器下载文件,故写此文给大家分享,Jsch功能很多,我只使用到了其中一点,本文只介绍使用Jsch通过SFTP下载文件并且使用了代理。
在正式说明之前我先大概说下什么是Jsch,Jsch是SSH2的纯java实现,那什么是SSH2呢,SSH有两个不兼容的版本SSH1跟SSH2,那什么是SSH呢,我摘了百度百科中的说明:"SSH 是目前较可靠,专为 远程登录 会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括 HP-UX 、 Linux 、 AIX 、 Solaris 、 Digital UNIX 、 Irix ,以及其他平台,都可运行SSH "。
1.准备需要的jar包
jsch-0.1.51.jar
2.开始编码
2.1创建Jsch对象
JSch jsch= new JSch();
2.2创建Session对象
Session session= jsch.getSession(String username, String host, int port);
2.3创建ProxyHTTP 对象
ProxyHTTP proxyhttp = new ProxyHTTP(String proxy_host, int proxy_port);
2.4配置session对象参数
session.setProxy(proxyhttp); session.setPassword(String password);//设置SFTP连接时指定用户的密码 session.setConfig("StrictHostKeyChecking", "no");//取消 第一次登陆的时候提示
session.setTimeout(10000);//设置超时时间
2.5建立session连接
session.connect();
2.6创建sftp通信信道
channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
2.7进入指定的文件夹,下载指定的文件
channel.cd(String path);
channel.get(String src,String dst);//src是源文件的绝对路径包括文件名,dst是指定将源文件下载存放的绝对路径包括文件名
2.8关闭连接
if(null!=channel) channel.disconnect();
if(null!=session)
session.disconnect();
-------------------------------------------------------------------------------------------------------------------------------
下面附上交易源码
-------------------------------------------------------------------------------------------------------------------------------
/* * Title: :BusiWxJSch.java
* Description:
* Copyright: Copyright (c) 2011
* Company: digitalchina.Ltd
* @author * Created :2017-11-27 10:58:18 * @version 1.0 * ModifyList: * */ package com.dcfs.eci.prod.busi.eod; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.dc.branch.service.AbstractBusiService; import com.dc.eai.data.CompositeData; import com.dc.esb.container.core.data.IServiceDataObject; import com.dc.esb.container.core.sclite.IBaseContext; import com.dc.impls.db.DBManagerFactory; import com.dc.interfaces.db.IDBAction; import com.dc.interfaces.db.IDBTransaction; import com.dc.interfaces.db.TransactionException; import com.dcfs.eci.prod.exception.BusiException; import com.dcfs.eci.prod.tools.ToolsStrBusi; import com.dcfs.eci.prod.tools.ftp.FtpConfig; import com.dcfs.eci.prod.tools.ftp.FtpPoolConfig; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.ProxyHTTP; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; /** * 通过代理实现SFTP下载微信对账文件 * * @author * @E-Mail */ public class BusiWxJSch extends AbstractBusiService { private Log log = LogFactory.getLog(BusiWxJSch.class); private String errorCode=null; @Override public IServiceDataObject doExecute(IServiceDataObject sdo,IBaseContext context) { if (log.isInfoEnabled()) { log.info("Execute Busi-Service:BusiWxJSch"); } CompositeData cd = (CompositeData)sdo; IDBTransaction dbTransaction = null; IDBAction dbAction = null; List> list=null; try { dbTransaction=super.getDBTransaction(); dbAction=DBManagerFactory.getDBManager().newDBAction("WeChat_Qry_FlowINFO", null); list=dbTransaction.selectList(dbAction); if(null==list || list.size()==0){ errorCode = "701590"; throw new BusiException(errorCode);//[统一电子渠道]微信流量充值信息表未配置! }else{ if(list.get(0).get("END_DATE")!=null){ /** * 微信流量充值信息表 中END_DATE的格式是yyyy/MM/dd,在Java的时间系统中是yyyy/MM/dd 00:00:00, * tips:结束时间设置的是2017/11/30 它代表的时间是2017/11/30 00:00:00 * 但正确的时间应该是在2017/11/30 23:59:59之前 * 故获取库中的日期做+1天处理,即表示在2017/12/01 00:00:00 之前 */ Calendar cal=Calendar.getInstance(); cal.setTime((Date) list.get(0).get("END_DATE")); if(log.isErrorEnabled()) log.error("数据库中配置的交易截止日期是: "+new SimpleDateFormat("yyyyMMdd").format(cal.getTime())); cal.add(Calendar.DAY_OF_MONTH, 1); Date endDate=cal.getTime(); if(log.isErrorEnabled()) log.error("转换后的交易截止日期是:"+new SimpleDateFormat("yyyyMMdd").format(endDate)); if(endDate.before(new Date())){ log.error("[统一电子渠道]流量充值活动已经结束!"); return sdo; } } } //获取SFTP配置参数 FtpConfig ftpConf=FtpPoolConfig.getFtpConfig("8082"); //使用SFTP下载文件并解析入库 initJsch(ftpConf,list); } catch (BusiException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ super.closeTransaction(); } //FIXME Not yet implemented return sdo; } /** * * 通过JSCH使用sftp下载对账文件 */ public void initJsch(FtpConfig ftpConf,List> list){ JSch jsch= new JSch(); Session session=null; ChannelSftp channel=null; try { /* * 经过代理创建sftp链接 */ session = jsch.getSession(ftpConf.getFtpUser(), ftpConf.getFtpHost(), Integer.parseInt(ftpConf.getFtpPort())); if(log.isErrorEnabled()) log.error("session初始化成功..."); String proxyHost=(String)list.get(0).get("TRANS_IP"); log.error("代理服务器IP是:"+proxyHost); String proxyPort=(String)list.get(0).get("TRANS_PORT"); log.error("代理服务器端口是:"+proxyPort); ProxyHTTP proxyhttp = new ProxyHTTP(proxyHost, Integer.parseInt(proxyPort)); session.setProxy(proxyhttp); session.setPassword(ftpConf.getFtpPwd()); session.setConfig("StrictHostKeyChecking", "no"); session.setTimeout(10000); session.connect(); if(log.isErrorEnabled()) log.error("session连接成功..."); channel = (ChannelSftp) session.openChannel("sftp"); channel.connect(); if(log.isErrorEnabled()) log.error("sftp连接成功..."); /* * 下载文件并解析文件的内容 */ getFile(channel,ftpConf); } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSchException e) { // TODO Auto-generated catch block log.error("sftp连接失败..."); e.printStackTrace(); log.info("Jsch连接失败信息是:"+e); }finally{ if(null!=channel) channel.disconnect(); if(null!=session) session.disconnect(); } } public void getFile(ChannelSftp channel,FtpConfig ftpConf){ String data=null; IDBTransaction dbTransaction=null; Calendar cal =Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, -1); //拼装文件名:flowrate_终端号_日期,如flowrate_20151961_20171101 String fileName="flowrate_20151961_"+new SimpleDateFormat("yyyyMMdd").format(cal.getTime()); log.info("文件名:"+fileName); try { channel.cd(ftpConf.getFtpTargetDir()); channel.get(ftpConf.getFtpTargetDir()+"/"+fileName, ftpConf.getFtpHomeDir()+"/"+fileName); File checkFile=new File(ftpConf.getFtpHomeDir()+"/"+fileName); if(!checkFile.exists()){ log.error("未找到流量对账文件"+ftpConf.getFtpHomeDir()+"/"+fileName+",交易返回...."); return; }else{ log.error("流量对账文件"+fileName+"下载成功...."); } if(log.isErrorEnabled()) log.error("开始解析微信对账文件--->"+fileName); FileInputStream fis=new FileInputStream(ftpConf.getFtpHomeDir()+"/"+fileName); InputStreamReader isr=new InputStreamReader(fis, "UTF-8"); BufferedReader br =new BufferedReader(isr); HashMap paraMap=new HashMap(); dbTransaction=DBManagerFactory.getDBManager().newTransaction(false); while((data = br.readLine())!=null && !data.trim().equals("")){ //数据格式:手机号|交易时间|交易流水(订单号)|销售金额(元)|面值|交易状态|外部流水 String[] result=data.split("\\|"); String phone = result[0]; if(!ToolsStrBusi.isNull(phone)) paraMap.put("CONTACT_INFO", phone.trim()); String status = result[5]; if(!ToolsStrBusi.isNull(status)){ status=status.trim(); paraMap.put("TRAN_STATUS", status); } IDBAction dbAction=DBManagerFactory.getDBManager().newDBAction("WeChat_Upd_ClientFlow", paraMap); dbTransaction.update(dbAction); } dbTransaction.commit(); if(checkFile.exists()){ if(checkFile.delete()) log.info("删除动账通知文件"+ftpConf.getFtpHomeDir()+"/"+fileName+"成功..."); } } catch (SftpException e) { // TODO Auto-generated catch block log.error("通过sftp下载微信动账文件失败..."); e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransactionException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ dbTransaction.close(); } } }