Android FTP 开发,我个人是使用commons-net-3.1.jar,别问我为什么是度娘教我的,附上commons-net-3.1.jar的开源下载地址http://grepcode.com/snapshot/repo1.maven.org/maven2/commons-net/commons-net/3.1
关于FTP我们在Android开发的时候先说一下特别需要注意,就当是正餐之前调味吧。
1.FTP是基于TCP/IP协议的常用端口是:21,也就是如果不设置端口实际上就是访问了21端口
2.FTP编程要特别考虑到编码的问题,尤其是要和FTP服务的编码能匹配,实际上一搬都是UTF-8,Android也是UTF-8,所以大部分时候没问题,但是一旦乱码就要想想是不是客户端的编码和服务端编码不匹配了。
3.由于Android上编程要求任何带网若访问的类不能放在主UI的绚烂线程,所以一定要注意另开线程使用这个包里FTP类org.apache.commons.net.ftp.FTPClient。
4.记得 <uses-permission android:name="android.permission.INTERNET" />加在AndroidManifest.xml之后
5.注意FTP服务起如果和客户端长时间没有信息交互可能会自动断开当前连接,所以根据实际情况每隔一段时间调用FTPClient类下的sendNoOp()方法这类似于心跳包。
下面是正餐直接上Demo效果图,有图有真相呵呵,功能一目了然,上传下载都有进度条,贴出源码下载地址,只要1分。
我封装一个工具类UitlsFTP(见源码),来处理FTP的连接,上传/下载,都是带进度的额
说一下代码的中关键小技巧部分,虽然利用重写InputStream的Read方法可以轻松实现进度监控,但是为了绚烂UI时节约性能,可以根据实际情况选择每隔300ms或是200ms渲染一次进度,我这里就是200ms绚烂一次
UtilsFTP.IProgressListener listener = new UtilsFTP.IProgressListener() {
long BEG=0;
@Override
public void onProgress(long len, long total) {
if(System.currentTimeMillis()-BEG>200||len==total)
{
BEG=System.currentTimeMillis();
String result = String.format("%.2f", 100 * (double) len / (double) total);
showTV(result + "%");
}
}
};
InputStream in2 = self.getResources().getAssets().open("a.mp3");
ftp.uploadWithProgress("001test/download3/我.mp3", in2, listener);