Android使用FTP实现断点续传
来源:互联网 发布:淘宝怎样把东西卖出去 编辑:程序博客网 时间:2024/06/10 16:24
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:功力有限,若有什么错误,请不吝赐教,谢谢
- Android使用FTP实现断点续传
- WinInet 实现ftp断点续传
- C++实现FTP断点续传
- FTP客户端实现断点续传
- java实现ftp断点续传
- FTP实现断点续传
- FTP实现断点续传
- ftp协议实现多线程断点续传
- ftp协议实现多线程断点续传
- FTP上传下载的断点续传实现
- ftp协议实现多线程断点续传
- ftp协议实现多线程断点续传
- ftp协议实现多线程断点续传
- ftp协议实现多线程断点续传
- ftp协议实现多线程断点续传
- FTP上传下载的断点续传实现
- commons.net FTP 实现断点续传
- FTP上传下载的断点续传实现
- android- ScrollView与ListView冲突(最后一条Item显示不全)
- 判断一个点是否在线段上
- web开发style中,z-index:2的使用
- FastDFS集群整体迁移的问题
- iOS9 企业级账号 无法安装的问题
- Android使用FTP实现断点续传
- iOS获取一个控件的子控件的方法
- 安卓实现的根据坐标显示位置功能
- iOS - UINavigationBar一些常用的设置
- ubuntu下修改hostname
- 151221总结
- OC语言 单例模式
- NSFileManager—基本的路径操作
- tp-上传图片,自带截取图片