上一篇
安卓开发连接ftp服务器
- 行业动态
- 2025-04-21
- 6
权限配置
在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.INTERNET" /> <!-Android 10+需添加后台运行权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
主流FTP库选择对比
库名称 | 特点 | 依赖体积 | 适用场景 |
---|---|---|---|
Apache Commons Net | 成熟稳定,支持FTP全部协议特性 | 28KB | 需要完整FTP功能 |
FTP4j | 轻量级,API设计简洁 | 15KB | 基础文件传输需求 |
OKHttp+FTP | 基于OKHttp自定义实现 | 灵活 | 需要集成其他网络请求 |
核心代码实现(以Apache Commons Net为例)
添加依赖
implementation 'commons-net:commons-net:3.9'
基础连接代码
// FTP工具类 public class FtpHelper { private FTPClient ftpClient; public boolean connect(String host, int port, String username, String password) { ftpClient = new FTPClient(); try { ftpClient.connect(host, port); return ftpClient.login(username, password); } catch (IOException e) { e.printStackTrace(); return false; } } public void disconnect() { if (ftpClient.isConnected()) { try { ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } }
文件上传下载示例
// 上传文件 public boolean uploadFile(String localPath, String remotePath) { FileInputStream fis = null; try { fis = new FileInputStream(localPath); return ftpClient.storeFile(remotePath, fis); } catch (IOException e) { e.printStackTrace(); return false; } finally { IOUtils.closeQuietly(fis); } } // 下载文件 public boolean downloadFile(String remotePath, String localPath) { FileOutputStream fos = null; try { fos = new FileOutputStream(localPath); return ftpClient.retrieveFile(remotePath, fos); } catch (IOException e) { e.printStackTrace(); return false; } finally { IOUtils.closeQuietly(fos); } }
关键配置项说明
配置项 | 作用 | 推荐值 |
---|---|---|
setFileType(FTP.BINARY) | 设置传输模式 | 二进制模式 |
enterLocalPassive() | 启用被动模式 | 默认开启 |
setBufferSize(size) | 设置传输缓冲区大小 | 10241024 |
setAutodetectUTF8(true) | 自动处理UTF-8编码 | true |
常见问题解决方案
连接超时问题
现象 | 解决方案 |
---|---|
连接特定服务器失败 | 检查服务器IP/端口,确认21端口开放,尝试切换主动/被动模式 |
所有服务器都无法连接 | 检查设备网络状态,确认INTERNET权限已声明,尝试在线程中执行网络操作 |
文件传输中断
原因 | 解决方案 |
---|---|
线程异常终止 | 使用AsyncTask或Coroutine处理网络操作 |
大文件传输失败 | 分片传输,设置buffer size为64KB以上,启用FTPClient.setControlKeepAliveTimeout(300) |
安全增强建议
- 数据加密:考虑使用FTPS(FTP over SSL)替代明文传输
- 凭证保护:避免硬编码账号密码,使用加密存储(如SharedPreferences with Encryption)
- 连接复用:保持长连接而非频繁创建销毁,提升性能
相关问题与解答
Q1:如何切换主动模式和被动模式?
A:通过调用ftpClient.enterLocalActive()
启用主动模式,或ftpClient.enterLocalPassive()
启用被动模式,大多数情况下推荐使用被动模式,特别是在移动设备处于NAT网络环境时。
Q2:如何处理大文件(>500MB)传输?
A:建议采用以下方案:
- 分块传输:将文件分割为多个小块(如5MB/块)逐块传输
- 断点续传:记录已传输字节数,异常中断后从断点继续
- 进度监控:通过监听数据传输事件更新UI进度条
- 内存优化:设置合理的buffer size(建议1-4MB