java:尝试将文件上传到FTP时拒绝连接

时间:2018-04-25 07:33:16

标签: java file-upload ftp

尝试使用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命令。

谢谢大家。 Eithan。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

拒绝连接意味着您的TCP连接请求已到达远程服务器(或更正确地>><<<远程服务器)但服务器不期望/正在侦听传入连接。所以它"拒绝"它

以下是要检查的内容:

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

问题也可能是由于防火墙做了故意混淆的事情。但这对于可公共路由的FTP服务器来说不太可能。

  

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

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