Android使用FTP实现断点续传

断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载。用户可以节省时间,提高速度。

我们都知道Android下使用HTTP实现断点续传很容易。因为我们在发送下载请求给服务器后,服务器会将该文件的信息返回给我们。同时我们也可以设置发送文件的起始位置,让服务器从该位置开始传输文件。

简单介绍一下FTP(File Transfer Protocol)文件传输协议。用于Internet上的控制文件的双向传输。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

FTP没有所谓的头文件,刚接触到还是有点雾水的,不知从何下手。但是查询一下资料后,觉得还是挺简单的,只需要一个指令。多说无益,给大家举个栗子- -、

private Runnable mRunnable = new Runnable() {

@Override

public void run() {

try {

try {

ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器

ftpClient.setControlEncoding("iso-8859-1");

} catch (Exception e) {

mHandler.sendEmptyMessage(DOWNLOAD_FAILED);

return;

}

if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode()))

return;

if (ftpClient.login(ftpUser, ftpPwd)) {

// 设置被动模式

ftpClient.enterLocalPassiveMode();

// 设置以二进制方式传输

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

// 检查远程文件是否存在

FTPFile[] files = ftpClient.listFiles(new String(

ftpFileName.getBytes("GBK"), "iso-8859-1"));

int per = (int) (files[0].getSize() / 100);

FileOutputStream output = null;

InputStream input = null;

long localSize = 0L;

if (files.length == 0) {// 文件不存在,下载失败

mHandler.sendEmptyMessage(DOWNLOAD_FAILED);

return;

} else {// 开始下载

File file = new File(strLocalFile);

if (file.exists()) {// 存在,开始续传

localSize = file.length();

if (localSize > files[0].getSize()) {// 下载完成

mHandler.sendEmptyMessage(DOWNLOAD_SUCCESS);

return;

}

// 从本地文件上续传

output = new FileOutputStream(file, true);

// 将文件指向已下载的位置

ftpClient.setRestartOffset(localSize);

input = ftpClient.retrieveFileStream(new String(

ftpFileName.getBytes("GBK"), "iso-8859-1"));

progress = (int) (localSize / per);

mHandler.sendEmptyMessage(DOWNLOAD_UPDATE);

} else {// 直接下载

output = new FileOutputStream(file);

input = ftpClient.retrieveFileStream(new String(

ftpFileName.getBytes("GBK"), "iso-8859-1"));

mHandler.sendEmptyMessage(DOWNLOAD_START);

}

if (output == null || input == null) {

mHandler.sendEmptyMessage(DOWNLOAD_FAILED);

return;

}

byte[] bytes = new byte[1024];

int c;

while ((c = input.read(bytes)) != -1) {

if (isBreak) {

Log.i("xxx", "已停止下载!");

mHandler.sendEmptyMessage(DOWNLOAD_STOP);

break;

}

output.write(bytes, 0, c);

localSize += c;

long nowProcess = localSize / per;

if (nowProcess > progress) {

progress = nowProcess;

if (progress % 1 == 0) {

Log.i("xxx", "下载进度:" + progress);

}

mHandler.sendEmptyMessage(DOWNLOAD_UPDATE);

}

}

input.close();

output.close();

if (c <= 0) {// 下载完成

mHandler.sendEmptyMessage(DOWNLOAD_SUCCESS);

} else {

mHandler.sendEmptyMessage(DOWNLOAD_STOP);

}

}

}

} catch (Exception e) {

try {

ftpClient.disconnect();

} catch (IOException e1) {

e1.printStackTrace();

}

e.printStackTrace();

}

}

};

下面说一下使用FTP具体流程以及注意事项。

1. FTP的连接以及下载操作必须放在子线程中

2. ftpClient.setControlEncoding(“iso-8859-1”)设置字符编码,防止出现中文乱码现象

3. 获取本地已下载文件大小,然后使用ftpClient.setRestartOffset(localSize),可以开始断点续传了

FTP实现断点续传就这么简单完成了,逃。

ps:我使用jar包是Apache的commons-net。实现FTP断点续传,服务端的FTP也得支持断点续传的指令。 pps:功力有限,若有什么错误,请不吝赐教,谢谢

ftp 断点续传 Android,Android使用FTP实现断点续传相关推荐

  1. android小记之FTP文件上传

    android客户端实现FTP文件(包括图片)上传应该没什么难度.写下来就了为了记录一下,望能帮到新手. 需要用到 commons-net-3.0.1.jar,后面附上jar包. 直接上代码: /** ...

  2. android 检测网络ftp,Android端与Android端利用WIFI进行FTP通信

    一.客户端通信工具类: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; im ...

  3. Android局域网实现FTP文件上传下载客户端与服务端

    文章目录 前言 一.FTP是什么? 二.使用步骤 1 服务端 1.1 服务端的代码实现 2 客户端 2.1 客户端的代码实现 附件 前言 最近在公司的项目中,使用到了 局域网通信,不同的设备直接传递消 ...

  4. libcurl开源库封装ftp工具,支持多线程并发、断点续传、超时连接、传输速率控制

    各位朋友好,第一次在CSDN写博客,后续时间充足的话会陆续更新一些资源,大家一起探讨交流,感谢!!! 如有任何疑问,可以留言. 目的:再次封装CURL接口,使用FTP相关接口更方便,更易懂 功能: 可 ...

  5. Android基于rxjava2+retrofit2实现断点续传下载,模拟支付宝更新app

    前言 在rxjava和retrofit日益火热的今天,我们也要给自己定个小目标,比如说利用其来实现支付宝更新app的断点续传下载功能. 基本原理 其实下载文件就是一个get请求,而断点续传则是要把发生 ...

  6. android sftp软件,Turbo FTP client SFTP client 安卓FTP、SFTP客户端推荐

    圆滑,直观,强大的Andr​​oid FTP客户端与SFTP客户更快,更容易的服务器维护. 下载地址:https://play.google.com/store/apps/details?id=tur ...

  7. Android开发-使用FTP协议和HTTP协议进行文件下载和上传

    FTP 是File Transfer Protocol(文件传输协议)的英文简称,从这个名字也能看出来,这个协议是为了文件传输而生的. 使用前需要下载一个commons-net-3.3.jar 直接看 ...

  8. linux系统的ftp命令大全,linux系统ftp命令(示例代码)

    先来一段简单的ftp 下载脚本 ftp -i -n< open 14.2.33.211 user etl etl cd /etlfile/ftpfile lcd /etlfile/getfile ...

  9. Jenkins使用Publish Over FTP Plugin插件上传FTP详解

    一.安装插件[Publish Over FTP] 二.在[系统管理]->[系统设置]->[Publish over FTP]->点击[增加]按钮,增加一个要连接的FTP: FTP S ...

最新文章

  1. 参观Speedy Cloud 有感
  2. C/C++语言中计算int,float,double,char四种数据类型所能表示的数据范围
  3. IDEA 2020.3.2控制台中文乱码分享(亲测二、下图中控制台的编码改为UTF-8)
  4. .NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...
  5. linux启动php服务_群晖docker 实现nodejs为后端的简单web服务器 并连接数据库
  6. 哈密顿路径_检查图形是否为哈密顿量(哈密顿路径)
  7. 系数矩阵为方阵的线性方程组解的情况
  8. abap 创建出口历程_SAP ABAP第一,两,三代出口型BADI实现 解释的概念
  9. python软件下载3版本-python
  10. 奥运22日看点:女乒女曲有望夺金 皮划艇全线出击
  11. dnf电脑服务器不稳定怎么办,Win10玩DNF间歇性卡顿怎么办?Win10系统玩DNF卡顿解决方法(2)...
  12. 缓存中间件技术选型Memcached、MongoDB、Redis
  13. 使用极大似然法对逻辑回归中的参数进行估计的数学原理
  14. 树莓派+欧西亚室外温度湿度传感器+Arduino Nano+433Mhz接收模块+RRDTOOL制作室内室外温湿度记录监控系统
  15. win7计算机还原点建立,win7系统每次启动自动创建还原点的处理技巧
  16. linux docker 软路由,OpenWrt软路由使用docker安装jellyfin影音中心
  17. c语言中calloc是什么意思,C语言中malloc和calloc以及relloc函数的区别
  18. spring security 整合sso全记录
  19. 多线程处理容器ExecutorCompletionService使用
  20. U9 ERP 系统BOM物料清单批量导入导出并新增修改功能

热门文章

  1. ABP快速开发一个.NET Core电商平台
  2. ERP的配置管理实践
  3. 搭建独立博客,这款评论插件不能错过
  4. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Mac OS
  5. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射
  6. .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)
  7. 「分布式系统理论」系列专题
  8. ASP.NET Core 沉思录 - 环境的思考
  9. surging 微服务引擎 1.0 正式发布
  10. aspnet core 2.1中使用jwt从原理到精通一