连接FTP服务器问题
1. IE 浏览器访问FTP ,
a) 地址栏输入ftp地址。输入用户名:密码:
2. 谷歌浏览器可以正常访问,没有资源管理器视图
3. Windows 资源管理器访问(其实就是ie访问)
4. Java 使用org.apache.commons.net.ftp.FTPClient; 访问
a) 连接connect 连接成功
b) Login 登录成功
c) 验证连接返回编码,ftp 连接成功
d) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
e) 设置文件传输类型 二进制
f) ftpClient.changeWorkingDirectory(Constants.FTP_PATH);
g) 切换工作目录
h) //ftpClient.enterLocalActiveMode();//主动模式
i) ftpClient.enterLocalPassiveMode();// 被动模式 (一般使用默认)
j) boolean appendFile = ftpClient.appendFile(name,inputStream);
k) 上传 文件,使用主动模式,无报错无异常,返回结果 false.ftp服务器没有上传成功。
l) 被动模式。上传文件。连接超时Connection timed out: connect
原因:
ftp 服务器部署在内网,通过桥接。提供外网访问。
我在外网访问ftp 服务器由于我也是逻辑外网,中间有防火墙。
导致主动模式下ftp服务器在传输文件时找不到客户端。于是使用被动模式
被动模式下。传输文件时,服务端开放高位端口(>1024) 提供给客户端访问。
并返回ip + 端口号,而这个ip 可能是ftp 服务器的内网ip , 客户端会默认使用该ip 及端口号进行访问取数据。由于该ip 为服务端内网。客户端无法访问。
导致 :
Ie 找不到该地址,认为无效(主链接为公网ip所以报请确认公网ip 是否正确。)
Java 根据内网ip访问,肯定访问不到。所以连接超时。
Googel chrome 浏览器 其内部有一定算法,发现服务器返回ip 不可用。将内网ip 替换为,首次访问使用的公网ip 。连接成功。
Xftp 我使用的版本不支持chrome 的自动切换 ,提示已连接公网ip但是 无法显示远程文件夹。
FileZilla客户端。自动尝试主动模式访问,访问失败,切换被动模式。
被动模式发现服务器返回ip不可用,使用外网ip 替换进行访问。连接成功。目录加载成功。//服务器发回了不可路由的地址。使用服务器地址代替。
l 解决办法
方法一:
服务器进行配置。具体配置百度
配置被动模式返回ip 设置为ftp服务器的公网ip
方法二:
客户端进行ip 替换,就像chrome 和FileZilla 客户端
Java 就需要模拟FileZilla客户端这样进行访问。
于是java 也需要进行ip替换策略。
由于我是用的apache.commons.net为1.4.1 没有ip 替换策略。查看apache.commons.net 最新代码发现。新的jar包FtpClient 提供了ip替换策略。于是下载了最新。Apache.commons.net 3.6 版本
FTPClient.HostnameResolver resolver = new FTPClient.NatServerResolverImpl(ftpClient);
//设置变通办法策略以替换 PASV 模式答复地址 ftpClient.setPassiveNatWorkaroundStrategy(resolver);
或者使用已废弃方法
ftpClient.setPassiveNatWorkaround(true);
连接成功,上传下载均好使了。
具体可查看 新版commons.net FtpClient.java 源码 。
连接FTP服务器问题
1. IE 浏览器访问FTP ,
a) 地址栏输入ftp地址。输入用户名:密码:
2. 谷歌浏览器可以正常访问,没有资源管理器视图
3. Windows 资源管理器访问(其实就是ie访问)
4. Java 使用org.apache.commons.net.ftp.FTPClient; 访问
a) 连接connect 连接成功
b) Login 登录成功
c) 验证连接返回编码,ftp 连接成功
d) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
e) 设置文件传输类型 二进制
f) ftpClient.changeWorkingDirectory(Constants.FTP_PATH);
g) 切换工作目录
h) //ftpClient.enterLocalActiveMode();//主动模式
i) ftpClient.enterLocalPassiveMode();// 被动模式(一般使用默认)
j) boolean appendFile = ftpClient.appendFile(name,inputStream);
k) 上传 文件,使用主动模式,无报错无异常,返回结果 false.ftp服务器没有上传成功。
l) 被动模式。上传文件。连接超时Connection timed out: connect
原因:
ftp 服务器部署在内网,通过桥接。提供外网访问。
我在外网访问ftp 服务器由于我也是逻辑外网,中间有防火墙。
导致主动模式下ftp服务器在传输文件时找不到客户端。于是使用被动模式
被动模式下。传输文件时,服务端开放高位端口(>1024) 提供给客户端访问。
并返回ip + 端口号,而这个ip 可能是ftp 服务器的内网ip , 客户端会默认使用该ip 及端口号进行访问取数据。由于该ip 为服务端内网。客户端无法访问。
导致 :
Ie 找不到该地址,认为无效(主链接为公网ip所以报请确认公网ip 是否正确。)
Java 根据内网ip访问,肯定访问不到。所以连接超时。
Googel chrome 浏览器 其内部有一定算法,发现服务器返回ip 不可用。将内网ip 替换为,首次访问使用的公网ip 。连接成功。
Xftp 我使用的版本不支持chrome 的自动切换 ,提示已连接公网ip但是 无法显示远程文件夹。
FileZilla客户端。自动尝试主动模式访问,访问失败,切换被动模式。
被动模式发现服务器返回ip不可用,使用外网ip 替换进行访问。连接成功。目录加载成功。//服务器发回了不可路由的地址。使用服务器地址代替。
l 解决办法
方法一:
服务器进行配置。具体配置百度
配置被动模式返回ip 设置为ftp服务器的公网ip
方法二:
客户端进行ip 替换,就像chrome 和FileZilla 客户端
Java 就需要模拟FileZilla客户端这样进行访问。
于是java 也需要进行ip替换策略。
由于我是用的apache.commons.net为1.4.1 没有ip 替换策略。查看apache.commons.net 最新代码发现。新的jar包FtpClient 提供了ip替换策略。于是下载了最新。Apache.commons.net 3.6 版本
FTPClient.HostnameResolver resolver = new FTPClient.NatServerResolverImpl(ftpClient);
//设置变通办法策略以替换 PASV 模式答复地址 ftpClient.setPassiveNatWorkaroundStrategy(resolver);
或者使用已废弃方法
ftpClient.setPassiveNatWorkaround(true);
连接成功,上传下载均好使了。
具体可查看 新版commons.net FtpClient.java 源码 。