ftpClient链接成功后程序一直停在那没有反应

    今天碰到很奇怪的现象: 我原来的FTP的代码在局域网内运行时一切成功。但是当我链接外网时就出现了意象不到的结果:程序已经可以登录的外网的远程服务器的上面,后台还打印出:230 Logged on .  然后程序就一直在那里不动了(一直在运行中),不知道是什么原因了??

     网上也找了一大堆的信息,结果没有什么效果。那个小伙子他换了个包,即他没把Apache的包换成其它的FTP包了。我本来也想换的,我试了下结果有太多的错误了。索性不换了,因为我相信Apache的包是比较完整的不可能出现我这样的情况,肯定是我的代码有问题了。

     就凭着上面我那种想法,终于功夫不负有心人,原因被我找到了,现在共享给大家用。

ftpClient.enterLocalPassiveMode();
设置它为被动模式就可以搞定这个问题了。即用"被动模式传输"。它可以设置在login之后或者之前都可以,我自己是设置在login之后。代码如下:

public void connectServer() {
	if (ftpClient == null) {
		int reply;
		try {
			setArg(configFile);
			ftpClient = new FTPClient();
			ftpClient.setControlEncoding("UTF-8");
			ftpClient.setDefaultPort(port);
			ftpClient.configure(getFtpConfig());
			ftpClient.connect(ip);
			ftpClient.login(username, password);
			ftpClient.setDefaultPort(port);
			System.out.println(ftpClient.getReplyString());
			reply = ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				System.err.println("FTP server refused connection.");
			}
			ftpClient.enterLocalPassiveMode();
			} catch (Exception e) {
				System.err.println("登录ftp服务器【" + ip + "】失败");
				e.printStackTrace();
			}
		}
	}

 最后给大家分享个好的文章:

FTP中的两种工作方式

下面的文章介绍了FTP的两种模式和在实际工作中的一些注意事项和使用技巧,希望对大家有所帮助,并和大家一起来探讨、交流。
FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动

方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP server。Passive模式FTP的客户端发送 PASV命令到 FTP Server。
下面介绍一个这两种方式的工作原理:
Standard模式FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通

道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 

FTP server必须和客户端建立一个新的连接用来传送数据。
Passive模式在建立控制通道的时候和Standard模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于

1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个

时候FTP server不再需要建立一个新的和客户端之间的连接。 
现在的FTP软件里面包括在IE5以上的版本里面也已经支持这两种模式了。一般一些FTP客户端的软件就比较好设置了,一般都有一个

PASV的选项,比如CuteFTP,传输的方式都有Standard和PASV的选项,可以自己进行选择;另外在IE里面如果要设置成PASV模式的话

可以选中工具-Internet选项-高级-为FTP站点启用文件夹视图,否则就采用Standard模式。
很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以FTP的Standard模式在许多时候在内部网络的机器通过防火墙出去

的时候受到了限制,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。当然也可以设置成功,首

先要创建一条规则就是允许内部的IP连接外部的IP的21端口;第二条就是禁止外部IP的TCP 20端口连接内部IP的<1024的端口,这条

是为了防止外部连接内部的常规端口;第三条验证ACK是否等于1,这个的原理就参见TCP建立连接的三次握手吧。所以如果安全的配

置的话非常困难,这个时候就想起来了PASV模式,因为不用建立新的连接,所以也就不会涉及到后面的问题了。但是管理员可能不

想使用PASV模式,因为这个时候FTP Server会开放一个随机的高端口,尽管在IIS4和IIS5里面端口的范围是1024-5000,但是许多

FTP Server的端口范围达到了1024-65535,这个时候在这个主动开放的随机端口上是有完全的访问权限的,如果IIS也要设置成开

放的端口为1024-65535,具体方法如下:
1. regedt32
2. 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 
3. 编辑-添加-数值
value Name: MaxUserPort Data Type: REG_DWORD value: 65534 
所以如果遇到了有防火墙的话或者怕配置麻烦的话还是采用PASV模式比较好些,但是如果真的对安全的需求很高的话建议采用Standard模式。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值