• 解决FTPClient linux环境下FTPClient调用retrieveFileStream导致线程挂起(防火墙问题);下载文件小于实际文件问题


    FTPClient调用retrieveFileStream导致线程挂起(防火墙问题);下载文件小于实际文件问题解决
    实际是因为FTP的两种传输模式:主动模式被动模式的不同而导致的

    FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里,什么反应都没有,出现假死状 态。google一把,发现很多人也出现了此类问题,最终在一个帖子里找到了解决办法。在调用这两个方法之前,调用 FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。

    最近因为项目需要,研究有关ftp的相关东西。结果发现一个问题。同样的程序在不同的机器上运行,结果有一个直接导致线程挂起,另外一个运行却正常。经过 反复的测试最后发现,线程挂起的那台机器装有防火墙,导致调用retrieveFileStream方法时直接线程挂起。

    经过网上一大堆的查找终于找到解决方法:

    ftpClient.enterLocalPassiveMode(); //开启本地被动模式
    设置FTPClient为被动传输模式即可解决线程挂起问题。此代码设置在登陆之后或者之前都可以。

    同样,这只适用于下载的被动传输模式,如果上传的话需要enterRemotePassiveMode()//开启远程被动传输模式

  • 相关阅读:
    VC++6.0 自定义按钮,无标题对话框的拖动方法
    完整的使用线程池的多线程C/S Socket类
    树形控件Tree Control
    关闭数据执行保护
    VC++开发垃圾文件清理软件(下)
    用完成端口开发大响应规模的Winsock应用程序
    去掉右键多余显卡菜单
    自动登陆系统
    查询数据库中所有表名和表中所有字段名
    单行编辑框文本垂直居中(包含计算字体高度)
  • 原文地址:https://www.cnblogs.com/bkywanly/p/9720989.html
Copyright © 2020-2023  润新知