我是靠谱客的博主 仁爱航空,最近开发中收集的这篇文章主要介绍解决JschException:connection is closed by foreign host异常,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
记录一次生产异常;一个跑批服务器,从其他系统获取文件数据进行同步,代码没任何变更,突然出现报错了。(因为该数据源系统变更不大,因此长时间未发现。到前几天发现时,已经找不到记录是哪边变更了)如图所示。
百度有找到相关比较全的解决方案
https://www.cnblogs.com/littlehb/p/11173901.html
但是我这边是客户端,不是源服务发布端,没法看到具体的配置信息,无法得知是不是连接数据量的问题。
最后找到运维问了他访问连接协议才找到具体的原因:
源文件服务器以FTP的协议发布,而本系统以SFTP协议进行访问,协议之间的差异导致。而为什么之前能访问因为时间过久无法找到原日志而无法得知。
期间查询了相关FTP协议和SFTP协议之间的差异:
- FTP使用TCP / IP协议。而SFTP是SSH协议的一部分,它是一种远程登录信息。
- FTP 不提供任何安全通道来在主机之间传输文件;而SFTP协议提供了一个安全通道。
- 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异常所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复