ftp 断点续传 Android,Android使用FTP实现断点续传
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实现断点续传相关推荐
- android小记之FTP文件上传
android客户端实现FTP文件(包括图片)上传应该没什么难度.写下来就了为了记录一下,望能帮到新手. 需要用到 commons-net-3.0.1.jar,后面附上jar包. 直接上代码: /** ...
- android 检测网络ftp,Android端与Android端利用WIFI进行FTP通信
一.客户端通信工具类: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; im ...
- Android局域网实现FTP文件上传下载客户端与服务端
文章目录 前言 一.FTP是什么? 二.使用步骤 1 服务端 1.1 服务端的代码实现 2 客户端 2.1 客户端的代码实现 附件 前言 最近在公司的项目中,使用到了 局域网通信,不同的设备直接传递消 ...
- libcurl开源库封装ftp工具,支持多线程并发、断点续传、超时连接、传输速率控制
各位朋友好,第一次在CSDN写博客,后续时间充足的话会陆续更新一些资源,大家一起探讨交流,感谢!!! 如有任何疑问,可以留言. 目的:再次封装CURL接口,使用FTP相关接口更方便,更易懂 功能: 可 ...
- Android基于rxjava2+retrofit2实现断点续传下载,模拟支付宝更新app
前言 在rxjava和retrofit日益火热的今天,我们也要给自己定个小目标,比如说利用其来实现支付宝更新app的断点续传下载功能. 基本原理 其实下载文件就是一个get请求,而断点续传则是要把发生 ...
- android sftp软件,Turbo FTP client SFTP client 安卓FTP、SFTP客户端推荐
圆滑,直观,强大的Android FTP客户端与SFTP客户更快,更容易的服务器维护. 下载地址:https://play.google.com/store/apps/details?id=tur ...
- Android开发-使用FTP协议和HTTP协议进行文件下载和上传
FTP 是File Transfer Protocol(文件传输协议)的英文简称,从这个名字也能看出来,这个协议是为了文件传输而生的. 使用前需要下载一个commons-net-3.3.jar 直接看 ...
- linux系统的ftp命令大全,linux系统ftp命令(示例代码)
先来一段简单的ftp 下载脚本 ftp -i -n< open 14.2.33.211 user etl etl cd /etlfile/ftpfile lcd /etlfile/getfile ...
- Jenkins使用Publish Over FTP Plugin插件上传FTP详解
一.安装插件[Publish Over FTP] 二.在[系统管理]->[系统设置]->[Publish over FTP]->点击[增加]按钮,增加一个要连接的FTP: FTP S ...
最新文章
- 参观Speedy Cloud 有感
- C/C++语言中计算int,float,double,char四种数据类型所能表示的数据范围
- IDEA 2020.3.2控制台中文乱码分享(亲测二、下图中控制台的编码改为UTF-8)
- .NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...
- linux启动php服务_群晖docker 实现nodejs为后端的简单web服务器 并连接数据库
- 哈密顿路径_检查图形是否为哈密顿量(哈密顿路径)
- 系数矩阵为方阵的线性方程组解的情况
- abap 创建出口历程_SAP ABAP第一,两,三代出口型BADI实现 解释的概念
- python软件下载3版本-python
- 奥运22日看点:女乒女曲有望夺金 皮划艇全线出击
- dnf电脑服务器不稳定怎么办,Win10玩DNF间歇性卡顿怎么办?Win10系统玩DNF卡顿解决方法(2)...
- 缓存中间件技术选型Memcached、MongoDB、Redis
- 使用极大似然法对逻辑回归中的参数进行估计的数学原理
- 树莓派+欧西亚室外温度湿度传感器+Arduino Nano+433Mhz接收模块+RRDTOOL制作室内室外温湿度记录监控系统
- win7计算机还原点建立,win7系统每次启动自动创建还原点的处理技巧
- linux docker 软路由,OpenWrt软路由使用docker安装jellyfin影音中心
- c语言中calloc是什么意思,C语言中malloc和calloc以及relloc函数的区别
- spring security 整合sso全记录
- 多线程处理容器ExecutorCompletionService使用
- U9 ERP 系统BOM物料清单批量导入导出并新增修改功能
热门文章
- ABP快速开发一个.NET Core电商平台
- ERP的配置管理实践
- 搭建独立博客,这款评论插件不能错过
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Mac OS
- 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射
- .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)
- 「分布式系统理论」系列专题
- ASP.NET Core 沉思录 - 环境的思考
- surging 微服务引擎 1.0 正式发布
- aspnet core 2.1中使用jwt从原理到精通一