栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

apache.commons.net.ftp 上传下载大文件时出现 FTPClient retrieveFile 假死(卡死)解决办法(3.5/3.6/3.7)

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

apache.commons.net.ftp 上传下载大文件时出现 FTPClient retrieveFile 假死(卡死)解决办法(3.5/3.6/3.7)

转载请注明出处:原博文传送门

1. 问题

使用 commons.net 包下载小文件时程序能够顺利完成,但在下载大文件时程序会将文件下载完毕(检查文件大小,跟需要下载的文件大小一直),但是一直卡在 FTPClient.retrieveFile 方法。在网上查找了很多原因,大概了解了问题的所在。

多大算大文件? 跟你的网速和服务器的网速有关系,其实不是大小问题,是跟数据传输时间有关系,具体原因请看下面。

2. 原因

FTPClient 连接时会产生两个 socket 连接,一个用来传输命令,一个用来传输数据。
当我们在上传和下载大文件时,只有传输数据的socket连接在活动,那么传输命令的socket长时间没有命令,就会被关闭,当我们文件下载或上传完毕后,FTPClient 调用 命令socket 就会一直等待,造成了上面说的问题。

3. 解决办法
  • 设置 FTPClient 每隔多少秒发送一次心跳信息

ftpClient.setControlKeepAliveTimeout(60); // 60s发送一次

    
    public void setControlKeepAliveTimeout(long controlIdle){
        __controlKeepAliveTimeout = controlIdle * 1000;
    }

我的配置信息

FTPClient ftpClient = new FTPClient();
ftpClient.setDefaultTimeout(3000);//设置默认超时时间
ftpClient.setConnectTimeout(3000);//设置连接超时时间
ftpClient.setDataTimeout(3000);//设置读取数据超时时间(每次socket传输,不是指整个下载)
ftpClient.setControlKeepAliveTimeout(60); // 设置ftp在上传或下载大文件时,保持ftp的control的socket连接keepalive
ftpClient.setControlEncoding("utf-8");//设置ftp字符集
ftpClient.enterLocalPassiveMode();//设置被动模式,文件传输端口设置
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906903.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号