org.apache.commons.net.ftp.FTPClient 下载文件提示Software caused connection abort: recv failed

今天在使用FTPClient下载文件时,登录成功了,但是提示下图所示的错误信息:

出现这个问题,本以为设置的读取文件目录不对,尝试修改多次无果。为了排除路径的问题,在firefox中安装了插件“FireFTP”,连接上之后,可以正常下载,于是该问题排除。

后来在http://blog.csdn.net/wangjinwei6912/article/details/6603152 看到这位朋友的提示防火墙的问题,于是打开系统的防火墙,发现系统的防火墙都是开着的,如下图所示:

尝试把防火墙关闭,再次运行程序,发现文件能够正常下载了。如下图所示:

此问题解决。

更深层次解析:

FTP 的连接模式有两种:主动模式和被动模式,我们的程序是采用主动模式来连接到ftp服务器的。(主动模式和被动模式的区别请参照:http://jackiechen.blog.51cto.com/196075/193883/),我们摘抄关于主动模式的相关说明如下:

      主动方式的FTP是这样的:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。

    针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:    

    1. 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接) 

    2. FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口)

    3. FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)

    4. 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)

从第3条,可以看出服务器端时会主动向客户端进行连接的,所以,本地需要开放防火墙才能完成数据的下载。

时间: 2024-10-19 00:46:24

org.apache.commons.net.ftp.FTPClient 下载文件提示Software caused connection abort: recv failed的相关文章

FTP上传文件,报错java.net.SocketException: Software caused connection abort: recv failed

FTP上传功能,使用之前写的代码,一直上传都没有问题,今天突然报这个错误: java.net.SocketException: Software caused connection abort: recv failed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152) at java.net.SocketIn

ftp org.apache.commons.net.ftp.FTPClient 判断文件是否存在

String path = "/SJPT/ONPUT/HMD_TEST/" ; FtpTool.getFTPClient().changeWorkingDirectory(path); String reply = FtpTool.getFTPClient().getReplyString().substring(0, 3); if (reply.equals("250")) { System.out.println("We will now proces

【FTP】org.apache.commons.net.ftp.FTPClient实现复杂的上传下载,操作目录,处理编码

和上一份简单 上传下载一样 来,任何的方法不懂的,http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html API拿走不谢!!! 1.FTP配置实体 1 package com.agen.util; 2 3 public class FtpConfig { 4 //主机ip 5 private String FtpHost = "192.168.18.252&quo

Android中使用Apache common ftp进行下载文件

在Android使用ftp下载资源 可以使用ftp4j组件,还可以用apache common net里面的ftp组件,这2个组件我都用过. 个人感觉Apache common net里面的组件比较好用一些,下面是一个实例. 项目中对ftp的使用进行了封装,添加了回调函数已经断点续传的方法. FTPCfg 用来存储ftp地址,密码等信息的. FTPClientProxy 只是个代理而已,里面主要封装了common ftp api IRetrieveListener做回调用的,比如用于是否下载完成

org.apache.commons.net.ftp

org.apache.commons.NET.ftp Class FTPClient类FTPClient java.lang.Object Java.lang.Object继承 org.apache.commons.net.SocketClient org.apache.commons.net.SocketClient org.apache.commons.net.ftp.FTP org.apache.commons.Net.ftp.FTP org.apache.commons.net.ftp.

C# 实现访问FTP服务器下载文件,获取文件夹信息小记

最近因为要开发广告制作工具,自动生成广告流,需要获取第三方服务器上的文件资源,经过摸索,从这次经历中记录下. FtpWebRequest reqFtp; WebResponse response = null; //获取文件夹信息 reqFtp = (FtpWebRequest)WebRequest.Create(this.ftp);//ftp://IP:port/文件夹名1/文件夹名2/.../文件夹名 reqFtp.UseBinary = true; reqFtp.KeepAlive = f

通过cmd命令到ftp上下载文件

通过cmd命令到ftp上下载文件 点击"开始"菜单.然后输入"cmd"点"enter"键,出现cmd命令执行框 2 输入"ftp"切换到到ftp下面.然后输入"open 服务器地址".点击回车键.会提示你输入用户名和密码. 3 登陆成功后.输入"cd"命令.会显示"远程目录",输入"dir"命令会显示目录下的文件,权限等相关信息.可以通过"

Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Could not create connection to database server.

报错信息:Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Could not create connection to database server.) 问题来源mysql-connecter-java 版本过低 如果你mysql的版本是m

Linux shell ftp命令下载文件 根据文件日期

需求:ftp获取远程数据的文件,根据文件的创建时间点下载文件. 可以自行扩展根据文件的大小等其他需求. 知识点总结: 1.获取文件的时间: ls -lrt|awk '{print $6" "$7" "$8}' 时间内容: Sep  8 16:03 2.时间格式转换 date -d "Sep 8 16:03" +%Y%m%d%H%M 转换结果: 201709081603 3.指定文件名,正则匹配 pattern="${month}.*.d