连接FTP服务器问题, java 超时 。 chrome 可以访问, FileZilla可以访问

连接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.net1.4.1  没有ip 替换策略。查看apache.commons.net 最新代码发现。新的jarFtpClient 提供了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 替换进行访问。连接成功。目录加载成功。//服务器发回了不可路由的地址。使用服务器地址代替。

 

 

解决办法

方法一:

      服务器进行配置。具体配置百度

      配置被动模式返回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服务器问题, java 超时 。 chrome 可以访问, FileZilla可以访问)