Java使用FTP下载文件报ConnectException

26 篇文章 2 订阅
在Windows系统上部署的项目使用FTP连接Linux服务器下载文件。连接服务器使用的FTP端口是21,在iptables中已经添加白名单:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

Java代码如下,使用ListAllFiles()遍历服务器上的文件。

public String[] ListAllFiles(String dir, String file_regEx) {
		String[] names = this.ListFiles(dir + file_regEx);
		return this.sort(names);
	}
	
public String[] ListFiles(String file_regEx) {
		try {
			ftpClient.enterLocalPassiveMode();
			String[] name = ftpClient.listNames(file_regEx);
			if (name == null)
				return new String[0];
			return this.sort(name);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new String[0];
	}
本地测试时发现可以使用FTP连接成功,但是在遍历文件夹下的文件时报连接超时:

java.net.ConnectException: Connection timed out: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:579)
	at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:726)
	at org.apache.commons.net.ftp.FTPClient.listNames(FTPClient.java:2528)
	:
	:
	:
	at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:111)
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)
在Linux服务器上将防火墙关闭(service iptables stop),测试成功。考虑是防火墙拦截了请求。检查代码发现代码中使用了ftpClient.enterLocalPassiveMode();方法,这个方法是用来在每次数据连接之前,ftpClient告诉ftp服务器开通一个端口来传输数据,这个端口是不固定的,所以导致请求被防火墙拦截。因为端口不固定就不能使用添加端口白名单的方法,可以添加ip白名单,运行指定ip的所有端口的请求都通过。
-A INPUT -s 192.168.1.100 -p tcp -j ACCEPT
添加白名单规则后启动防火墙(service iptables start),测试成功。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值