ftpClient链接成功后程序一直停在那没有反应
关键字: ftpclient 外网/局域网 链接成功 程序一直运行 没有反应
今天碰到很奇怪的现象: 我原来的FTP的代码在局域网内运行时一切成功。但是当我链接外网时就出现了意象不到的结果:程序已经可以登录的外网的远程服务器的上面,后台还打印出:230 Logged on . 然后程序就一直在那里不动了(一直在运行中),不知道是什么原因了??
网上也找了一大堆的信息,结果没有什么效果。那个小伙子他换了个包,即他没把Apache的包换成其它的FTP包了。我本来也想换的,我试了下结果有太多的错误了。索性不换了,因为我相信Apache的包是比较完整的不可能出现我这样的情况,肯定是我的代码有问题了。
就凭着上面我那种想法,终于功夫不负有心人,原因被我找到了,现在共享给大家用。
Java代码
1. ftpClient.enterLocalPassiveMode();
2. 设置它为被动模式就可以搞定这个问题了。即用"被动模式传输"。它可以设置在login之后或者之前都可以,我自己是设置在login之后。代码如下:
3.
4. public void connectServer() {
5. if (ftpClient == null) {
6. int reply;
7. try {
8. setArg(configFile);
9. ftpClient = new FTPClient();
10. ftpClient.setControlEncoding("UTF-8");
11. ftpClient.setDefaultPort(port);
12. ftpClient.configure(getFtpConfig());
13. ftpClient.connect(ip);
14. ftpClient.login(username, password);
15. ftpClient.setDefaultPort(port);
16. System.out.println(ftpClient.getReplyString());
17. reply = ftpClient.getReplyCode();
18. if (!FTPReply.isPositiveCompletion(reply)) {
19. ftpClient.disconnect();
20. System.err.println("FTP server refused connection.");
21. }
22. ftpClient.enterLocalPassiveMode();
23. } catch (Exception e) {
24. System.err.println("登录ftp服务器【" + ip + "】失败");
25. e.printStackTrace();
26. }
27. }
28. }
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模式。
分享到:
相关推荐
Java FTP下载源程序是用于通过FTP(File Transfer Protocol,文件传输协议)在Java应用程序中实现文件上传和下载功能的关键技术。FTPClient是一个流行的Java库,它提供了与FTP服务器交互的接口,使得开发者能够轻松...
5. **数据传输模式**:FTP有两种数据传输模式,主动(PORT)模式和被动(PASV)模式。FTPClient库允许用户根据网络环境选择合适的模式。 6. **文件属性修改**:例如,可以设置文件的权限、修改时间等。 7. **错误...
Apache的FTPClient.jar是Apache Commons Net库的一部分,用于在Java应用程序中实现FTP(文件传输协议)客户端功能。这个工具类提供了丰富的API,使得开发者能够轻松地与FTP服务器进行交互,执行上传、下载、删除文件...
sun.net.ftp.FtpClient,it.sauronsoftware.ftp4j.FTPClient,org.apache.commons.net.ftp.FTPClient三种不同的方式操作FTP
使用FTPClient,开发者可以连接到FTP服务器,设置各种参数如主动模式和被动模式,登录用户,以及处理文件传输。 1. **连接和登录**: - `FTPClient.connect(String server)`:连接到指定的FTP服务器。 - `...
此外,FTP有主动和被动两种模式,主动模式下,服务器主动连接客户端的数据端口,而在被动模式下,客户端需要向服务器请求一个新的端口并由服务器连接过来,以避免防火墙问题。`TcpClient`和`Socket`类都提供了相应的...
FTPClient是Apache Commons Net库中的一个关键类,用于在Java应用程序中执行FTP(文件传输协议)操作。在本文中,我们将深入探讨如何使用FTPClient来实现FTP文件上传,特别是处理中文文件名的上传问题。 FTP是一种...
这个库编译后生成的System.Net.FtpClient.dll文件,为开发者提供了与FTP服务器交互的接口,极大地简化了FTP操作的复杂性。 首先,我们要了解FTP(File Transfer Protocol),它是互联网上最常用的一种文件传输协议...
FTPClient是Java编程中用于实现FTP(文件传输协议)客户端功能的一个库,它允许开发者通过编程方式连接到FTP服务器,进行文件的上传、下载、删除等操作。在本文中,我们将详细探讨FTPClient的使用方法及其相关知识点...
`FTPClient`还支持使用被动模式(`enterLocalPassiveMode()`)和主动模式(`enterLocalActiveMode()`)进行数据传输,以适应不同的网络环境。此外,它也支持SSL/TLS加密(通过`FTPSClient`子类),以增强传输安全性...
FTP有两种模式,主动(PORT)模式和被动(PASV)模式,根据服务器设置和网络环境,FTPClient需要选择合适的方式进行连接。 5. **错误处理与异常安全**:在执行FTP操作时,可能会遇到各种网络问题或服务器错误。MFC...
在Java程序中,使用FTPClient可以方便地实现文件的上传和下载。 2. **FTP文件上传**: - 首先,通过`FTPClient.connect()`方法建立与FTP服务器的连接。连接时可以指定主机名(URL)和端口号。默认FTP端口是21,如果...
这个库支持主动和被动模式,可以处理FTP的各种复杂情况,如断线重连、文件传输模式(ASCII或二进制)、文件权限控制等。 使用Apache FTPClient时,开发者首先需要将这两个JAR文件添加到项目的类路径中。然后,可以...
FTPClient与FTPServer之间的交互涉及许多命令和响应,如USER和PASS用于身份验证,CWD和PWD用于改变和查看当前工作目录,LIST和NLST用于获取目录列表,PUT和GET用于上传和下载文件,以及DELE和RMD用于删除文件和目录...
在Linux和Windows服务器上,FTPClient都能工作,因为FTP协议本身是跨平台的。不过,可能需要注意的是,不同操作系统对文件路径的处理可能会有所不同,因此在编写代码时需要考虑这一点。 总结来说,FTPClient是Java...
在这个QT和C++编写的`ftpClient`客户端中,我们探讨的是如何利用这两种技术来实现FTP服务的功能,包括文件的上传和下载。 QT是一个跨平台的开发框架,由C++语言编写,提供了丰富的图形用户界面(GUI)工具包,以及...
ftpclient用于实现java的文件上传和下载
FTPClient是Java编程中用于实现FTP(文件传输协议)客户端功能的一个重要库。在Java开发中,如果需要从远程服务器上传或下载文件,通常会使用Apache的Commons Net库,其中包含了FTPClient组件。`commons-...
在IT行业中,FTPClient扮演着重要角色,尤其在数据迁移、文件共享和远程协作场景中。下面我们将详细探讨FTPClient的相关知识点。 1. FTP协议基础: FTP是一种应用层协议,用于在网络上进行文件传输。它基于TCP/IP...
Ftp Client FtpClient 组件 源码 可以做升级程序,我就是用这个做的。 大家可以试用一下。