"Connection refused" 当连接到 Java 中的 FTP 端口 990 时

"Connection refused" when connecting to FTP port 990 in Java

我制作了一个 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) 部分失败并出现错误

Exception in thread "main" java.net.ConnectException: Connection refused: >connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 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 org.apache.commons.net.SocketClient.connect(SocketClient.java:182) at org.apache.commons.net.SocketClient.connect(SocketClient.java:203) at org.apache.commons.net.SocketClient.connect(SocketClient.java:296) at com.samsung.ftptest.ftptest.main(ftptest.java:66)

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

谢谢。

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

无论如何你最好使用显式模式:

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

(假设服务器完全支持 FTP 而不是 TLS/SSL)

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

  • 服务器未侦听端口 990
  • 防火墙阻止了端口 990

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

  • 配置使用哪个端口?
  • 是否使用:
    • explicit FTPS(这是执行 FTPS 的首选、符合标准的方式。它在端口 21 上以普通 FTP 连接,然后协商到一个安全的协议。
    • implicit 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——但众​​所周知,防火墙管理员不愿意这样做。