尝试使用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。
答案 0 :(得分:0)
这纯粹是一种猜测,但是当目标主机/端口上没有任何内容侦听时,通常会发生java.net.ConnectException: Connection refused
。您没有在CLI示例中指定端口,因此可能是问题所在。尝试将ftp.connect(host,21);
更改为ftp.connect(host);
以使用默认值。同时确认主机名完全相同。
这假设错误发生在connect()
的调用上。您还没有提供足够大的堆栈跟踪来指示任何一种方式。
答案 1 :(得分:0)
拒绝连接意味着您的TCP连接请求已到达远程服务器(或更正确地>><<<远程服务器)但服务器不期望/正在侦听传入连接。所以它"拒绝"它
以下是要检查的内容:
问题也可能是由于防火墙做了故意混淆的事情。但这对于可公共路由的FTP服务器来说不太可能。
也许我没有正确使用enterLocalPassiveMode()或setUseEPSVwithIPv4()方法?
这可能不是问题所在。堆栈跟踪显示您的应用程序在尝试建立与服务器的初始连接时失败。你还没有达到可以打电话的地步。