【问题标题】:java: getting Connection refused when trying to upload file to FTPjava:尝试将文件上传到FTP时连接被拒绝
【发布时间】:2018-04-25 07:33:15
【问题描述】:

当尝试使用 java 程序上传文件到 FTP 时:

public void upload(String localFile,String remoteFile) throws Exception{
       ftp = new FTPClient(); 
       ftp.setControlKeepAliveTimeout(300);
       ftp.connect(host,21);    
       ftp.enterLocalPassiveMode();     
       ftp.setUseEPSVwithIPv4(false);   
       ftp.login(user,password);    
       ftp.setFileType(FTPClient.BINARY_FILE_TYPE);      

       FileInputStream in = null;
       in = new FileInputStream(localFile);
       ftp.storeFile(remoteFile,in);
       in.close();  
       ftp.disconnect();

}

我明白了:

java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:381)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:243)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:230)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:377)
    at java.net.Socket.connect(Socket.java:539)
    at org.apache.commons.net.SocketClient._connect(SocketClient.java:243)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:202)

当我尝试使用命令行(从 linux)上传相同的文件时,我只能在使用 EPSV 时这样做:

llnx:~ ftp anonymous@9.20.1.116
Connected to 9.20.1.116.
220 Microsoft FTP Service
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp> epsv
EPSV/EPRT on IPv4 off.
ftp> put /tmp/file1.xml /dir_1/file1.xml
local: /tmp/file1.xml remote: /dir_1/file1.xml
227 Entering Passive Mode (10,40,1,149,233,168).
125 Data connection already open; Transfer starting.
100% |*************************************|   117 KB   28.66 MB/s    --:-- ETA
226 Transfer complete.
120032 bytes sent in 00:00 (7.96 MB/s)

那么,为什么我的 java 代码连接被拒绝?

也许我没有正确使用 enterLocalPassiveMode() 或 setUseEPSVwithIPv4() 方法?

***我认为答案是如何从Java程序运行EPSV命令。

谢谢大家。 艾森。

【问题讨论】:

  • 我猜异常是在ftp.connect(host,21); 行中抛出的,因此主机名/ip 或端口可能存在问题,也可能是某些东西阻塞了连接。你是在控制台的同一台机器上执行java程序吗?
  • 是的。同一台机器。
  • host 是 FTP 服务器的主机名还是 IP 地址?
  • host参数是FTP服务器的IP地址

标签: java file-upload ftp


【解决方案1】:

这纯粹是一个猜测,但java.net.ConnectException: Connection refused 通常发生在目标主机/端口上没有任何监听的情况下。您没有在 CLI 示例中指定端口,所以这可能是问题所在。尝试将 ftp.connect(host,21); 更改为 ftp.connect(host); 以使用默认值。还要确认主机名完全相同。

这假定错误出现在对connect() 的调用上。您没有提供足够大的堆栈跟踪来指示任何一种方式。

【讨论】:

  • 谢谢。从方法中删除端口不起作用......关于堆栈跟踪,其余部分是我自己的代码调用上传方法:在 util.MyFTPUtil.upload(FTPUtil.java:53) 在 com.MyProjectManager.copyFromFSIntoFTP (ReportsManager.java:134)
【解决方案2】:

连接被拒绝意味着您的 TCP 连接请求已到达远程服务器(或更准确地说 >>a

以下是要检查的事项:

  • 检查您的 FTP 服务器的远程主机名或 IP 地址是否正确。
  • 检查您使用的 FTP 服务器端口是否正确。端口 21 是默认端口,但可能服务器位于非标准端口上。
  • 检查 FTP 服务器是否实际运行。

问题也可能是由于防火墙故意造成混淆。但对于可公开路由的 FTP 服务器来说,这不太可能。


也许我没有正确使用 enterLocalPassiveMode() 或 setUseEPSVwithIPv4() 方法?

这不是问题。堆栈跟踪显示您的应用程序在尝试建立与服务器的初始连接时失败。你还没有达到可以拨打这些电话的地步。

【讨论】:

  • 谢谢。但正如我在主帖中提到的,我在命令行中使用了相同的 IP 并且它正在工作(仅当我添加 EPSV 命令时)。我认为答案是如何从 Java 程序运行 EPSV 命令。我试过上面的“ftp.enterLocalPassiveMode();”还有“ftp.setUseEPSVwithIPv4(false);”有了所有的变化,它并没有帮助。也许通过Java执行“EPSV”命令的其他方式?
  • “我在命令行中使用相同的 IP” - 你确定吗?而且您确定您的命令行“ftp”命令没有通过本地 FTP 代理连接……也许您没有告诉 Java?
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 2021-11-16
  • 2019-10-20
  • 2019-02-09
  • 2020-01-29
  • 1970-01-01
  • 2023-02-06
  • 2021-12-23
相关资源
最近更新 更多