解决FTPClient linux 下载文件小于实际文件,线程挂起等问题
2016-04-15 00:00
441 查看
FTPClient调用retrieveFileStream导致线程挂起(防火墙问题);下载文件小于实际文件问题解决
实际是因为FTP的两种传输模式:主动模式和被动模式的不同而导致的
FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里,什么反应都没有,出现假死状态。google一把,发现很多人也出现了此类问题,最终在一个帖子里找到了解决办法。在调用这两个方法之前,调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。
最近因为项目需要,研究有关ftp的相关东西。结果发现一个问题。同样的程序在不同的机器上运行,结果有一个直接导致线程挂起,另外一个运行却正常。经过反复的测试最后发现,线程挂起的那台机器装有防火墙,导致调用retrieveFileStream方法时直接线程挂起。
经过网上一大堆的查找终于找到解决方法:
ftpClient.enterLocalPassiveMode(); //开启本地被动模式
设置FTPClient为被动传输模式即可解决线程挂起问题。此代码设置在登陆之后或者之前都可以。
同样,这只适用于下载的被动传输模式,如果上传的话需要enterRemotePassiveMode()//开启远程被动传输模式
实际是因为FTP的两种传输模式:主动模式和被动模式的不同而导致的
FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里,什么反应都没有,出现假死状态。google一把,发现很多人也出现了此类问题,最终在一个帖子里找到了解决办法。在调用这两个方法之前,调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。
最近因为项目需要,研究有关ftp的相关东西。结果发现一个问题。同样的程序在不同的机器上运行,结果有一个直接导致线程挂起,另外一个运行却正常。经过反复的测试最后发现,线程挂起的那台机器装有防火墙,导致调用retrieveFileStream方法时直接线程挂起。
经过网上一大堆的查找终于找到解决方法:
ftpClient.enterLocalPassiveMode(); //开启本地被动模式
设置FTPClient为被动传输模式即可解决线程挂起问题。此代码设置在登陆之后或者之前都可以。
同样,这只适用于下载的被动传输模式,如果上传的话需要enterRemotePassiveMode()//开启远程被动传输模式
相关文章推荐
- 学习Linux的正确姿势,你get到了吗?
- ubuntu下alias使用详解(有许多需要注意的细节)
- 离线centos6下安装Ambari2.2.1和HDP2.4
- linux脚本编程之条件判断
- linux下编译下载的源代码
- 2.2.1 鸟哥的Linux学习之路
- 2.1 Linux当前的应用角色
- Linux 中的零拷贝技术,第 2 部分
- Linux 中的零拷贝技术,第 1 部分
- 1.3.2 Linux的优缺点
- Linux——树莓派系统分区
- sendfile:Linux中的"零拷贝"
- 《Linux内核分析》第八周笔记 进程的切换和系统的一般执行过程
- 官网Red Hat Enterprise Linux 6 Power Management Guide
- 1.3.1 Linux的特色
- Linux指令汇集
- Linux下的tar压缩解压缩命令详解
- system函数的分析
- linux的sendfile系统调用
- Linux文件系统的类型