FTP的两种连接模式
2012-06-22 23:22
302 查看
最近做对账文件下载,第三方支付使用FTP下载模式,初次使用FTP下载,就遇到连接问题。初始化FTP连接成功,但是在获取文件流的时候出现了阻塞。后来发现是因为FTP的连接模式方式问题。
自己归纳了下:
FTP具 有两种模式,分别是port模式(也叫主动模式)和pasv模式(也叫被动模式),怎么来理解这两种模式呢?我来打个比喻吧,在主动模式下:客户端给服务 器端的21端口发命令说,我要下载什么什么,并且还会说我已经打开了自己的某个端口,你就从这里把东西给我吧,服务器知道后就会通过另外一个数据端口把东 西传给客户端,这就是主动模式,可以理解为服务端主动给客户端传输文件;在被动模式下:客户端给服务器端的21端口发命令说,我要下载什么什么,服务器端 知道后,就打开一个端口,然后告诉客户端,我已经打开了某某端口,你自己进去拿吧,于是客户端就从那个端口进去拿文件了,这就是被动模式,可以理解为服务
端被客户端拿走了东西。
一般自己搭建的基本FTP服务器都是主动模式,但是大部分对外FTP服务器是被动模式,为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。
简单贴下自己的代码:(本次连接FTP为被动模式)
/**
* 根据参数构建FTP
*
* @param server
* IP地址
* @param port
* 端口号,允许为null
* @param username
* 用户名
* @param password
* 密码
*/
public FTPFileUtils(String server, Integer port, String username,
String password) {
try {
ftp = new FTPClient();
// 设置中文
ftp.setControlEncoding("UTF-8");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");
if (server != null) {
this.server = server;
if (port != null) {
ftp.connect(server, port);
} else {
ftp.connect(server);
}
}
if (username != null && username.length() > 0 && password != null
&& password.length() > 0) {
this.username = username;
this.password = password;
ftp.login(username, password);
ftp.enterLocalPassiveMode();
}
} catch (Exception e) {
throw new RuntimeException("初始化FTP连接失败!", e);
}
}
/**
* 获取远程文件输入流
*
* @param fileName
* 文件名
* @return 输入流
*/
public InputStream getFileInputStream(String fileName) {
InputStream is = null;
try {
if (ftp == null || !ftp.isConnected()) {
return null;
}
is = ftp.retrieveFileStream(fileName);
} catch (IOException e) {
throw new RuntimeException("获取远程文件输入流出错!", e);
}
return is;
}
如上代码,当第一行被标红的代码未写的时候,第二行标红代码FTPClient.retrieveFileStream()方法时,就停止在那里,什么反应都没有,出现假死状态。(FTPClient.listFiles()或者FTPClient.retrieveFile()方法也会出现同样的情况)。于是便要在调用这两个方法之前,调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。至于为什么,上面已经说明。
自己归纳了下:
FTP具 有两种模式,分别是port模式(也叫主动模式)和pasv模式(也叫被动模式),怎么来理解这两种模式呢?我来打个比喻吧,在主动模式下:客户端给服务 器端的21端口发命令说,我要下载什么什么,并且还会说我已经打开了自己的某个端口,你就从这里把东西给我吧,服务器知道后就会通过另外一个数据端口把东 西传给客户端,这就是主动模式,可以理解为服务端主动给客户端传输文件;在被动模式下:客户端给服务器端的21端口发命令说,我要下载什么什么,服务器端 知道后,就打开一个端口,然后告诉客户端,我已经打开了某某端口,你自己进去拿吧,于是客户端就从那个端口进去拿文件了,这就是被动模式,可以理解为服务
端被客户端拿走了东西。
一般自己搭建的基本FTP服务器都是主动模式,但是大部分对外FTP服务器是被动模式,为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。
简单贴下自己的代码:(本次连接FTP为被动模式)
/**
* 根据参数构建FTP
*
* @param server
* IP地址
* @param port
* 端口号,允许为null
* @param username
* 用户名
* @param password
* 密码
*/
public FTPFileUtils(String server, Integer port, String username,
String password) {
try {
ftp = new FTPClient();
// 设置中文
ftp.setControlEncoding("UTF-8");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");
if (server != null) {
this.server = server;
if (port != null) {
ftp.connect(server, port);
} else {
ftp.connect(server);
}
}
if (username != null && username.length() > 0 && password != null
&& password.length() > 0) {
this.username = username;
this.password = password;
ftp.login(username, password);
ftp.enterLocalPassiveMode();
}
} catch (Exception e) {
throw new RuntimeException("初始化FTP连接失败!", e);
}
}
/**
* 获取远程文件输入流
*
* @param fileName
* 文件名
* @return 输入流
*/
public InputStream getFileInputStream(String fileName) {
InputStream is = null;
try {
if (ftp == null || !ftp.isConnected()) {
return null;
}
is = ftp.retrieveFileStream(fileName);
} catch (IOException e) {
throw new RuntimeException("获取远程文件输入流出错!", e);
}
return is;
}
如上代码,当第一行被标红的代码未写的时候,第二行标红代码FTPClient.retrieveFileStream()方法时,就停止在那里,什么反应都没有,出现假死状态。(FTPClient.listFiles()或者FTPClient.retrieveFile()方法也会出现同样的情况)。于是便要在调用这两个方法之前,调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。至于为什么,上面已经说明。
相关文章推荐
- FTP的两种连接模式:Port模式和Pasv模式
- FTP 两种连接模式 (主动模式被动模式)
- FTP的两种连接模式:Port模式和Pasv模式
- FTP两种连接模式
- FTP协议分析(FTP两种连接模式详解)
- FTP的两种连接模式!
- FTP两种连接模式-PORT(主动)和PASV(被动)
- 关于FTP的两种连接模式
- FTP两种工作模式:主动模式(Active FTP)和被动模式
- FTP文件传输协议两种模式-主动模式和被动模式
- FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
- FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
- 关于linux中FTP的两种传输模式及常用的命令
- 【转】ftp的两种模式
- FTP具有两种模式
- [svc]ftp协议数据连接的2种模式
- FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式
- 设置Serv-U FTP 支持被动模式连接 ,530错误等解决办法
- 解决因传输模式设置不当致FTP无法连接的问题
- ftp上传问题解决过程以及思考-pasv以及port两种模式