You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:40:27