今天碰到很奇怪的现象: 我原来的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模式。
分享到:
相关推荐
Java FTP下载源程序是用于通过FTP(File Transfer Protocol,文件传输协议)在Java应用程序中实现文件上传和下载功能的关键技术。FTPClient是一个流行的Java库,它提供了与FTP服务器交互的接口,使得开发者能够轻松...
1. **连接与断开**:程序可以使用FTPClient建立到FTP服务器的连接,并在完成任务后断开连接。这涉及设置主机名、端口号、用户名和密码。 2. **登录验证**:在连接到服务器后,用户需要通过用户名和密码进行身份验证...
5. 在完成操作后,记得断开连接并释放资源。 `jakarta-oro-2.0.8.zip`同样需要解压并将jar文件加入类路径。在需要使用正则表达式的地方,可以通过ORO提供的API来编写匹配逻辑。 总的来说,这两个库为Java开发者...
FTPClient的jar包 FTPClient ftpClient = new FTPClient(); ftpClient.connect("ftp.foo.com"); ftpClient.login("user01", "pass1234"); ftpClient.download("C:\\Temp\\&quo; t;, "README.txt"); // ...
FTPClient是Apache Commons Net库中的一个关键类,用于在Java应用程序中执行FTP(文件传输协议)操作。在本文中,我们将深入探讨如何使用FTPClient来实现FTP文件上传,特别是处理中文文件名的上传问题。 FTP是一种...
这个库编译后生成的System.Net.FtpClient.dll文件,为开发者提供了与FTP服务器交互的接口,极大地简化了FTP操作的复杂性。 首先,我们要了解FTP(File Transfer Protocol),它是互联网上最常用的一种文件传输协议...
在完成所有操作后,记得断开与FTP服务器的连接: ```java ftpClient.logout(); ftpClient.disconnect(); ``` 为了处理可能出现的异常,你应该在上述代码中加入适当的错误处理。例如,使用try-catch语句块来捕获和...
Apache的FTPClient.jar是Apache Commons Net库的一部分,用于在Java应用程序中实现FTP(文件传输协议)客户端功能。这个工具类提供了丰富的API,使得开发者能够轻松地与FTP服务器进行交互,执行上传、下载、删除文件...
ftpclient用于实现java的文件上传和下载
sun.net.ftp.FtpClient,it.sauronsoftware.ftp4j.FTPClient,org.apache.commons.net.ftp.FTPClient三种不同的方式操作FTP
下面将详细介绍`FtpClient`在Java中的应用及其主要功能。 首先,`FtpClient`类是Apache Commons Net库的核心组件,它模拟了FTP服务器的行为,允许开发者通过Java代码与FTP服务器进行交互。在使用`FtpClient`之前,...
FTPClient是Java编程中用于实现FTP(文件传输协议)客户端功能的一个库,它允许开发者通过编程方式连接到FTP服务器,进行文件的...在实际开发中,正确理解和使用FTPClient的API是构建安全、可靠的FTP应用程序的关键。
连接成功后,需要检查`FTPReply`代码以确认连接是否有效。如果连接失败,应断开连接并处理异常。 ```java FTPClient ftp = new FTPClient(); try { ftp.connect("ftp.foobar.com"); int replyCode = ftp....
总之,FTPClient英文API提供了一套全面的工具,用于在Java应用程序中实现FTP文件传输。通过熟练掌握这些API,开发者可以构建出功能强大的FTP客户端应用,满足各种文件交互需求。在实际项目中,务必遵循安全实践,...
CE FTPClient
综上所述,FTPClient.jar 提供了一种高效且便捷的方式,帮助Java开发者在他们的应用程序中实现FTP功能。通过使用Apache Commons Net库的不同版本,开发者可以根据项目需求选择合适的API和性能特性。在实际应用中,...
FTPClient是一款基于C# 2.0开发的Windows应用程序,它实现了FTP(文件传输协议)客户端的功能,允许用户与FTP服务器进行交互,如上传、下载、列出目录、删除文件等。这个源码对于学习和理解网络编程,尤其是FTP协议...
登录成功后,你可以使用`FTPClient`的API进行其他操作,比如改变工作目录: ```java ftpClient.changeWorkingDirectory("/public_html"); ``` 或者上传文件: ```java FileInputStream fis = new FileInputStream...
C#的FTP操作类库,支持FTP文件的上传,下载等等,封装好的可直接引用FtpClient; 如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的...那就是System.Net.FtpClient,链接地址:https://netftp.codeplex.com
因为开发一个项目要用到FTP上传功能,用的是.NET平台,当时找了半天也没有关于FTP的类,索性就自己写了一个。找了很多资料,并参考了一下Java的sun.net.FtpClient类,总算可以拿出来用,所以就迫不及待的传上来给大家...