我是靠谱客的博主 仁爱航空,最近开发中收集的这篇文章主要介绍解决JschException:connection is closed by foreign host异常,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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;
	}
}

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

最后

以上就是仁爱航空为你收集整理的解决JschException:connection is closed by foreign host异常的全部内容,希望文章能够帮你解决解决JschException:connection is closed by foreign host异常所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部