【问题标题】:"Connection refused" when connecting to FTP port 990 in Java在 Java 中连接到 FTP 端口 990 时出现“连接被拒绝”
【发布时间】:2018-02-12 08:17:26
【问题描述】:

我创建了一组 FTPS 客户端,并尝试将其连接到我感兴趣的 ip 和端口。这是代码。

public class ftptest 
{   
    public static void delete_files(String path, int n) throws IOException
    {
        String realpath;
        for(int i=0 ; i<n ; i++)
        {
            realpath = path+i;
            File file = new File(realpath);
            FileUtils.cleanDirectory(file);
        }
    }

    public static void main(String[] args) throws Exception
    {
        int number = 1;
        String ip = "some_ip";
        int port = 990;

        FTPSClient[] client = new FTPSClient[number];

        System.out.println(ip);
        System.out.println("port = "+ port);


        for(int i = 0; i < number; i++)
        {
            String path = "D:\\ftptest\\client"+i;          
            File file = new File(path);
            file.mkdir();       


            client[i] = new FTPSClient(true);   
            client[i].setRemoteVerificationEnabled(false);
            client[i].setTrustManager
            (TrustManagerUtils.getAcceptAllTrustManager());         

            client[i].enterLocalPassiveMode();


            client[i].setControlEncoding("UTF-8");
            client[i].connect(ip,port);

            System.out.println("Connected to " + ip + ".");
        }   
    }
}

但不知何故,它在 client[i].connect(ip, port) 部分失败并出现错误

线程“main”java.net.ConnectException 中的异常:连接被拒绝:>connect 在 java.net.DualStackPlainSocketImpl.connect0(本机方法) 在 java.net.DualStackPlainSocketImpl.socketConnect(未知来源) 在 java.net.AbstractPlainSocketImpl.doConnect(未知来源) 在 java.net.AbstractPlainSocketImpl.connectToAddress(未知来源) 在 java.net.AbstractPlainSocketImpl.connect(未知来源) 在 java.net.PlainSocketImpl.connect(未知来源) 在 java.net.SocksSocketImpl.connect(未知来源) 在 java.net.Socket.connect(未知来源) 在 org.apache.commons.net.SocketClient.connect(SocketClient.java:182) 在 org.apache.commons.net.SocketClient.connect(SocketClient.java:203) 在 org.apache.commons.net.SocketClient.connect(SocketClient.java:296) 在 com.samsung.ftptest.ftptest.main(ftptest.java:66)

当它是 FTP 而不是 FTPS 时,它工作正常。有人知道为什么它不起作用吗?

谢谢。

【问题讨论】:

  • 可能没有为 ftps 设置 ftp 服务器?
  • @Scary Wombat 感谢您的评论。那么你会假设代码本身没有问题吗?顺便说一句,我将 client[i] = new FTSClient("true") 更改为 client[i] = new FTSClient(true),删除了引号。
  • 对不起,我没有为你做这个假设
  • “但不知何故失败了” 比如它是如何失败的?显示堆栈跟踪。
  • 再次,您可以使用任何独立的 FTP(S) 客户端从同一台机器连接到同一端口吗? - 你为什么连你的隐式模式?

标签: java ftp ftps apache-commons-net


【解决方案1】:

您运行此程序的系统无法连接到服务器计算机上的端口 990。出现这种情况的原因有很多,包括:

  • 服务器没有监听 990 端口
  • 防火墙阻止了端口 990

您应该做的第一件事是找到一个使用 FTPS 成功连接到此服务器的客户端,并检查其配置:

  • 它配置为使用哪个端口?
  • 是否使用:
    • 显式 FTPS(这是执行 FTPS 的首选、符合标准的方式。它在端口 21 上以普通 FTP 连接,然后协商到安全协议。
    • 隐式 FTPS(这种方法从未成为标准,但确实出现在野外。与 HTTPS 一样,使用不同的端口(通常为 990),并且在连接后立即发生 SSL 握手)

一旦你知道了这些事情,你就可以将正确的端口和正确的模式放入你的代码中。

如果您确定该端口,并且它可以在其他机器上运行,那么防火墙可能是罪魁祸首。证明你无法连接,使用 telnet:

 unixprompt$ telnet serverhostname 990

如果它挂起,或者说“连接被拒绝”,你就知道这台机器无法访问它。如果你得到“连接到...”,你至少知道你有 TCP 连接(然后ctrl-] quit 出去)。

如果您发现它是防火墙,请做好战斗准备。您正在为控制连接而苦苦挣扎——数据连接是一场全新的战斗。为被动模式显式 FTPS 打开防火墙相当简单,并记录在此 IETF 草案中:https://datatracker.ietf.org/doc/html/draft-fordh-ftp-ssl-firewall-00 -- 但众所周知,防火墙管理员不愿意这样做。

【讨论】:

  • 非常感谢您的友好和具体的回答。事实证明,感兴趣的服务器不支持端口 990。更改为端口 21 将问题转移到另一个问题 - javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException:。这是一个又一个问题,但您的解决方案是正确的!非常感谢,祝您有愉快的一天!
【解决方案2】:

服务器可能不支持(已弃用)隐式 FTPS 模式。

你最好还是使用显式模式:

client[i] = new FTPSClient();   
// ...
client[i].connect(ip, 21);

(假设服务器确实支持 FTP over TLS/SSL)

【讨论】:

  • 我们无法猜测服务器是符合标准的显式模式,还是已弃用的隐式模式。 OP 应使用已知可工作的客户端进行测试。
  • 感谢您的评论。就我而言,两者都没有解决:(
  • 从您对另一个问题的评论看来,我的解决方案确实有效。它带来了另一个问题是另一个话题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2021-01-18
  • 2019-01-07
  • 2019-04-30
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多