ftp4j上报Too many connections异常,上传8个文件后同步终止如何解决?
问题根因
你当前代码的核心问题是只有文件不存在、执行上传操作的分支才会释放FTP连接,如果文件已存在走跳过上传的分支,或者代码运行过程中抛出异常,FTP连接会一直被占用不会释放,连续8次走未释放连接的分支后就会触发FTP服务器的单IP连接数限制,抛出421错误。
解决方案
1. 保证所有逻辑分支都会释放连接
把连接释放逻辑放到finally块中,不管上传成功、跳过上传还是抛出异常,都能正常注销登录、断开连接,参考修正后的代码:
FTPClient ftpClient = new FTPClient(); ftpClient.setPassive(true); try { if (!ftpClient.isConnected()) { ftpClient.connect(server, port); }else { Log.i(TAG,"FTP already connected"); } if (!ftpClient.isAuthenticated()) { ftpClient.login(username, password); }else { Log.i(TAG,"FTP already Logged In"); } ftpClient.changeDirectory(rfolderpath); String[] files = ftpClient.listNames(); if (Arrays.asList(files).contains(filename)) { Log.i(TAG, filename + " Already Found in FTP, Skipping"); } else { Log.i(TAG, "Sending Go Ahead For Upload"); File file = new File(filepath); Log.i(TAG, "Uploading File: " + filename); ftpClient.upload(file); } } catch (FTPException e) { // 按需添加异常处理逻辑,比如重试、上报错误等 Log.e(TAG, "FTP operation failed", e); } finally { // 所有分支最终都会走这里释放连接 if (ftpClient.isAuthenticated()) { try { ftpClient.logout(); } catch (FTPException e) { Log.e(TAG, "FTP logout failed", e); } } if (ftpClient.isConnected()) { try { ftpClient.disconnect(true); } catch (FTPException e) { Log.e(TAG, "FTP disconnect failed", e); } } }
2. 复用单条FTP连接(可选优化)
如果是批量上传大量文件,不需要每次处理文件都新建连接,可以全局复用同一个FTP连接,所有文件处理完成后再统一释放,能减少连接建立/断开的开销,也能避免频繁创建连接触发服务器限制。
3. 增加连接失败重试机制(可选优化)
如果偶发网络波动导致连接异常断开,可以增加3-5次的重试逻辑,避免单次失败就终止整个同步任务。
内容的提问来源于stack exchange,提问作者Panache
相关产品推荐
相关产品推荐

