• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

解决JschException:connection is closed by foreign host异常

武飞扬头像
翻身大咸鱼
帮助1

记录一次生产异常;一个跑批服务器,从其他系统获取文件数据进行同步,代码没任何变更,突然出现报错了。(因为该数据源系统变更不大,因此长时间未发现。到前几天发现时,已经找不到记录是哪边变更了)学新通如图所示。
百度有找到相关比较全的解决方案

https://www.cnblogs.com/littlehb/p/11173901.html

但是我这边是客户端,不是源服务发布端,没法看到具体的配置信息,无法得知是不是连接数据量的问题。
最后找到运维问了他访问连接协议才找到具体的原因:
源文件服务器以FTP的协议发布,而本系统以SFTP协议进行访问,协议之间的差异导致。而为什么之前能访问因为时间过久无法找到原日志而无法得知。
期间查询了相关FTP协议和SFTP协议之间的差异:

  1. FTP使用TCP / IP协议。而SFTP是SSH协议的一部分,它是一种远程登录信息。
  2. FTP 不提供任何安全通道来在主机之间传输文件;而SFTP协议提供了一个安全通道。
  3. FTP密码和数据以纯文本格式发送,大多数情况下是不加密的。而SFTP会在发送之前加密数据,二进制的形式传递安全性较高。

https://blog.csdn.net/xishining/article/details/86610889

因为无法找到是那边的原因,我们这边只能变更代码连接服务器,因此又写了一个FTP连接使用的util。因为只要下载,再加上原代码取数传数的原因,不想改动太大(加上第二天晚上就要上线,中间还有测试),所以就只写了个简单的工具类。

import sun.net.ftp.FtpClient;

public class FtpUtil{
	private String ip;//ip地址
	private String userName;//用户名
	private String passWord;//密码
	private String port;//端口

	public void FtpUtil(Map<String,String>  map){
		this.ip=map.get("ip");
		this.userName=map.get("userName");
		this.passWord=map.get("passWord");
		this.port=map.get("port");
	}
	public FtpClient connet(){
		FtpClient ftp = null;
		int portInt = Interger.parseInt(port);
		try{
			SocketAddress addr = new InetSocketAddress(ip,portInt);
			ftp = FtpClient.create();//这里要抛出异常,我为了方便直接抛出exception
			ftp.setConnectTimeout(20*1000);
			ftp.setReadTimeout(20*1000);//这里设置超时时间,但是连接超时好像是这个read的生效
			ftp.connect(addr);
			ftp.login(userName,passWord.tpCharArray());
			ftp.setBinaryType();
		}catch(Exception e){
			e.printStachTrace();
		}
		return ftp;
	}
	public ArrayList<String> loadFileContext(String filePath,String fileName , FtpClient ftp){
		ArrayList<String> list =new  ArrayList<String>();
		InputStream input = null;
		InputStreamReader inputSt = null;
		BufferedReader reader = null;
		try{
			//为什么不在之前拼起来是为了减少代码变更量,原SFTP是分开传,sftp.cd(filePath),然后再sftp.get(fileName);
			input = ftp.getFileStream(filePath fileName);//这里就直接去获取了
			inputSt=new InputStreamReader(input,"GBK");
			reader=new BufferedReader(inputSt)
			String temp = null;
			while((temp = reader.readLine())!= null){
				list.add(temp);
			}

		}catch(Exception e){
			e.printStachTrace();
		}finally{
			try{
				input.close()
			}catch(Exception e){
				e.printStachTrace();
			}
			try{
				inputSt.close()
			}catch(Exception e){
				e.printStachTrace();
			}
			try{
				reader.close()
			}catch(Exception e){
				e.printStachTrace();
			}
			try{
				ftp.close()
			}catch(Exception e){
				e.printStachTrace();
			}
		}
		return list;
	}
}
学新通

将当前工具类新增进去,替换工具类就完美解决了。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhihaikg
系列文章
更多 icon
同类精品
更多 icon
继续加载