Java通过SFTP传输大量文件时遇「连接被关闭」问题求助
问题解决建议
你遇到的com.jcraft.jsch.JSchException: connection is closed by foreign host错误,大概率是Mac端SFTP服务器因短时间内接收大量请求触发限流或资源耗尽,以下是具体解决思路:
1. 复用SFTP连接而非每次新建
当前代码每次调用sftpPut可能都在新建连接,1000次循环会创建1000个独立连接,这对服务器压力极大。应该初始化一次SFTP连接,在循环中复用该连接传输所有文件,传输完成后统一关闭连接。
调整后的核心逻辑示例:
secureFtp s = new secureFtp(); // 提前建立一次连接并保持 s.connect(host, user, pwd); for (int i = 0; i < 1000; i++) { // 使用已建立的连接传输文件,避免重复创建连接 s.sftpPutWithExistingConn(sFile, destFullpath, iLastMod); } // 所有文件传输完成后关闭连接 s.disconnect();
(需修改secureFtp类,拆分连接建立与文件传输的逻辑,让sftpPutWithExistingConn方法复用已有的SFTP通道)
2. 按需添加传输间隔(sleep)
如果复用连接后仍出现问题,可以在每次文件传输后添加短时间休眠,给服务器留出处理缓冲时间,例如:
Thread.sleep(100); // 每次传输后暂停100毫秒,可根据实际情况调整时长
这是临时缓解方案,优先级低于连接复用。
3. 优化文件传输策略
- 合并小文件:若存在大量极小文件,先打包成压缩包再传输,减少传输次数和服务器处理压力。
- 控制并发数:如果是多线程传输,需限制并发连接/请求数,避免同时发起过多请求压垮服务器。
4. 检查Mac端SFTP服务器配置
- 查看OpenSSH的
MaxSessions、MaxStartups参数,适当调整允许的并发会话数或连接数。 - 监控服务器的磁盘IO、CPU使用率,确认是否因硬件资源瓶颈导致主动断开连接。
5. 升级JSch版本
jsch-0.1.55是2016年的旧版本,后续版本修复了不少连接稳定性相关的bug,尝试升级到最新稳定版(如0.1.59及以上),可能解决底层连接问题。
内容的提问来源于stack exchange,提问作者KjellPettersen
相关产品推荐
相关产品推荐

