"连接被拒绝"在Java中连接到FTP端口990时

时间:2017-09-04 06:09:13

标签: java ftp ftps apache-commons-net

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

  

线程中的异常&#34; main&#34; java.net.ConnectException:拒绝连接:&gt;连接     at java.net.DualStackPlainSocketImpl.connect0(Native Method)     在java.net.DualStackPlainSocketImpl.socketConnect(未知来源)     at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)     at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)     在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时,它工作正常。有没有人知道它为什么不起作用?

谢谢。

2 个答案:

答案 0 :(得分:2)

您运行此系统的系统无法连接到服务器计算机上的端口990。可能存在多种原因,包括:

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

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

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

一旦了解了这些内容,就可以将正确的端口和正确的模式放入代码中。

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

 unixprompt$ telnet serverhostname 990

如果它挂起,或说'#34;连接被拒绝&#34;,您就知道这台机器无法到达它。如果你得到&#34;连接到......&#34;你知道至少你有TCP连接(然后ctrl-] quit出来)。

如果您发现它是防火墙,请为战斗做好准备。你正在努力控制连接 - 数据连接是一场全新的战斗。打开被动模式显式FTPS的防火墙非常简单,并在本IETF草案中记录:https://tools.ietf.org/html/draft-fordh-ftp-ssl-firewall-00 - 但是防火墙管理员非常不愿意这样做。

答案 1 :(得分:1)

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

最好还是使用显式模式:

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

(假设服务器确实支持基于TLS / SSL的FTP)