您的位置:首页 > 编程语言 > PHP开发

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开通一个端口来传输数据。至于为什么,上面已经说明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: