java - 使用 Java 连接 SFTP 时发生 UnknownHostException

标签 java linux amazon-ec2 sftp jsch

我正在尝试使用 Java 中的 5 个线程将文件连续上传到 SFTP 服务器, 在启动程序时正确上传文件,但一段时间后,

所有线程在尝试创建新 session 时抛出 UnknownHostException 并且异常持续长达 5 到 10 分钟,一段时间后程序正常工作,我无法找到导致此异常的原因,

这是用于连接sftp的代码,

        JSch jsch = new JSch();
        jsch.setKnownHosts(host_file);
        session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);
        session.setPassword(SFTPPASS);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        channel = session.openChannel("sftp");
        channel.connect();

异常:

 at td.bdops.clupload.CARUpload.uploadZip(CARUpload.java:398)
    at td.bdops.clupload.CARUpload.uploadZip(CARUpload.java:398)
Caused by: java.net.UnknownHostException: sftp.opsbank2-prod.tio.systems
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at com.jcraft.jsch.Util.createSocket(Util.java:343)
    at com.jcraft.jsch.Session.connect(Session.java:215)
    at com.jcraft.jsch.Session.connect(Session.java:183)
    at td.bdops.util.FTPUtility.uploadAWSFTP(FTPUtility.java:227)
    at td.bdops.util.FTPUtility.uploadAWSFTP(FTPUtility.java:247)

谁能解释一下,这个错误的根本原因是什么

最佳答案

All threads throws UnknownHostException when trying to create new session and Exception continues up to 5 to 10 minutes,after some time program works normally, i cant able to find what will cause for this Exception...

这是不言自明的。阅读 javadocs for UnknownHostException :

Thrown to indicate that the IP address of a host could not be determined.

查看 AbstractPlainSocketImpl 的代码,我明白了:

if (addr.isUnresolved())
   throw new UnknownHostException(addr.getHostName());

因此您的 sftp.opsbank2-prod.tio.systems 主机名无法解析。这意味着 Java 的名称解析代码无法确定该主机名的 IP 是什么。

这里有一些尝试:

  • 使用该主机名的 IP 而不是名称。
  • 使用 dighost 命令在该系统上查找该主机名,看它是否解析。
  • 尝试下面的代码行,看看它是否有效。它也应该抛出:

    new java.net.Socket("unknown.host.should.throw.com", 80).close();
    
  • 现在试试你的主机名:

    new java.net.Socket("sftp.opsbank2-prod.tio.systems", 80).close();
    

如果您发现您的主机名未解析,那么您需要将其添加到 DNS 配置或 /etc/hosts 文件中。如果您已经拥有,那么这些文件有问题,您需要重新检查您的配置。

关于java - 使用 Java 连接 SFTP 时发生 UnknownHostException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46013658/

相关文章:

java - ByteBuffer allocateDirect 花费了很长时间

c - 查找可用端口以使用 BSD 打开伪终端

linux - 混合hadoop集群

linux - 我的第一个 Bash 脚本看起来效率不高

ruby-on-rails - 应用 AWS SSL 证书后的负载均衡器健康检查

java - 按排序顺序返回唯一条目的随机数生成器

java - 如何从 recyclerView 和 sqlite 数据库中删除行?

java - 如何将 Optional<String> 值分配或设置为 String 变量?

linux - 亚马逊网络服务 (AWS) - 亚马逊 Linux : How to install libel-dev and g++?

linux - Jenkins 亚马逊 Linux 设置