`
zy116494718
  • 浏览: 476771 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

视频库之断点下载

    博客分类:
  • Java
 
阅读更多

断点续传主要是使用http协议中range的属性来取得资源的部分内容,由于一般服务是不对外直接提供url访问的,一般都是通过id,在servlet中输出byte[]来实现,所以要想实现断点续传一般要自己实现一个服务端。

一个简单实现:
服务端:主要是分析了range属性,利用RandomAccessFile读取内容输出字节流

    public class Download extends HttpServlet {  
      
        @Override  
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
                throws ServletException, IOException {  
      
            int id = Integer.parseInt(req.getParameter("id"));  
            String filename ;  
            if (id == 1)  
                filename = "E:/JDK_API_1_5_zh_CN.CHM";  
            else if (id == 2)  
                filename = "E;/JDK_API_1_6_zh_CN.CHM";  
            else if (id == 3)  
                filename = "E:/apache-tomcat-5.5.26/webapps/ROOT/tomcat.gif";  
            else  
                filename = "c.rar";  
      
            RandomAccessFile raFile = new RandomAccessFile(filename, "r");  
              
            String range = req.getHeader("RANGE");  
            int start=0, end=0;  
            if(null!=range && range.startsWith("bytes=")){  
                String[] values =range.split("=")[1].split("-");  
                start = Integer.parseInt(values[0]);  
                end = Integer.parseInt(values[1]);  
            }  
            int requestSize=0;  
            if(end!=0 && end > start){  
                requestSize = end - start + 1;  
                resp.addHeader("content-length", ""+(requestSize));  
            } else {  
                requestSize = Integer.MAX_VALUE;  
            }  
              
            byte[] buffer = new byte[4096];  
              
            resp.setContentType("application/x-download");  
            resp.addHeader("Content-Disposition", "attachment;filename=a.chm");  
            ServletOutputStream os = resp.getOutputStream();  
              
            int needSize = requestSize;  
              
            raFile.seek(start);  
            while(needSize > 0){  
                int len = raFile.read(buffer);  
                if(needSize < buffer.length){  
                    os.write(buffer,0,needSize);  
                } else {  
                    os.write(buffer,0,len);  
                    if(len < buffer.length){  
                        break;  
                    }  
                }  
                needSize -= buffer.length;  
            }  
                  
            raFile.close();  
            os.close();  
        }  
    }  
 



客户端:分两次取得部分内容,输出到RandomAccessFile中

 
    public static void main(String[] args) throws MalformedURLException, FileNotFoundException {  
            test1(0,1000);  
            test1(1001,0);  
        }  
          
        public static void test1(int start, int end) throws MalformedURLException, FileNotFoundException{  
              
            String endpoint = "http://localhost:8080/Hello/download?id=1";  
              
            RandomAccessFile raFile = new RandomAccessFile("E:/temp/test.chm", "rw");  
              
            URL url = new URL(endpoint);  
            try {  
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
                //conn.addRequestProperty("location", "/tomcat.gif");  
                conn.setRequestProperty("Content-Type","text/html; charset=UTF-8");   
                conn.setRequestProperty("RANGE","bytes="+start+"-"+end);   
                  
                conn.connect();  
                System.out.println(conn.getResponseCode());  
                System.out.println(conn.getContentLength());  
                System.out.println(conn.getContentType());  
                  
                InputStream ins = (InputStream)conn.getContent();  
                  
                raFile.seek(start);  
                  
                byte[] buffer = new byte[4096];  
                int len = -1;  
                while((len = ins.read(buffer))!=-1){  
                    raFile.write(buffer,0,len);  
                }  
                raFile.close();  
                conn.disconnect();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  

 

接下来的工作:实现客户端的并发,多线程,即多个下载任务同时进行,连接的复用,实现暂停,显示进度条,下载完成的事件处理等,不涉及具体业务,搭建整个架构。

分享到:
评论

相关推荐

    Android多线程断点续传下载网络上的音/视频等各种文件

    在Android开发中,实现多线程断点续传下载网络上的音视频文件是一项重要的技能,尤其对于提升用户体验和节省用户流量至关重要。断点续传允许用户在暂停或因网络问题中断下载后,从上次停止的位置继续,而多线程则能...

    http断点下载

    在提供的压缩包文件中,`httpconaction`可能是实现HTTP连接和断点下载逻辑的源代码文件,而`libs`则可能包含了依赖的库文件,如网络请求库或文件操作库。分析这些文件可以帮助我们更深入地理解具体的实现细节。在...

    Android 多线程断点下载源码demo

    在Android应用开发中,多线程断点下载是一项重要的技术,尤其对于大文件的下载,如游戏、视频或大型应用程序。这项技术可以让用户在下载过程中随时暂停,之后可以从已下载的位置继续,而无需重新开始。以下是对这个...

    ios-ios多文件下载,后台下载,队列下载,断点下载.zip

    `ios-ios多文件下载,后台下载,队列下载,断点下载.zip`这个压缩包提供的代码示例,`MCDownloadManager`是一个专门用于管理下载任务的工具,它涵盖了iOS开发中的核心下载策略。以下是关于这些知识点的详细解释: 1...

    down断点下载

    断点下载技术是一种在大文件下载过程中非常实用的功能,它允许用户中断并重新开始下载,而无需从头开始。在互联网上,特别是对于大型软件、高清视频或大型数据集等大文件,断点续传可以极大地提高用户体验,因为它...

    oss下载(断点续传,后台显示进度)源代码.rar

    在Java中,可能使用Swing或JavaFX等库来创建GUI,通过回调函数或者轮询方式获取下载进度,然后更新进度条组件。 4. **多线程编程**:为了实现后台下载不影响前台界面的正常工作,通常会使用多线程。一个线程负责...

    Android中使用HTTP协议实现多线程断点下载案例

    以下是实现Android多线程断点下载的步骤: 1. **初始化**: 创建一个下载服务或后台任务,用于处理下载操作。获取待下载文件的URL,通过HTTP HEAD请求获取文件的总大小。 2. **文件分块**: 根据设备性能和网络状况...

    c#异步多线程http文件分块断点续传下载工具

    在现代互联网应用中,大文件的传输已经成为常态,无论是软件更新、高清视频还是大型数据交换,都对下载工具提出了更高的要求。其中,断点续传和分块下载技术是提升用户体验的关键。本文将详细探讨如何使用C#语言实现...

    Android之多线程下载及断点续传

    在Android开发中,多线程下载和断点续传是两个关键的概念,它们极大地提高了应用程序在处理大文件,如音频、视频或应用安装包时的性能和用户体验。下面将详细介绍这两个概念及其应用。 **一、多线程下载** 1. **多...

    android 提供的支持断点续传的文件下载(可以用来下载 image、video、pdf、apk 等等任意类型的文件).zip

    这个名为PRDownloader的开源库(对应压缩包中的PRDownloader-master)提供了完整的断点续传下载功能。它是一个强大的Android下载管理器,支持多任务下载、后台下载、速度限制等功能。开发者可以参考其源码学习如何...

    android 断点下载小demo

    在Android开发中,断点下载是一项实用的技术,它允许用户在中断网络连接后从上次停止的地方继续下载大文件,如应用程序、音乐或视频。本文将详细介绍如何实现一个简单的Android断点下载Demo,以便开发者理解其核心...

    Android项目流媒体线程下载,播放,(支持断点).rar

    在Android平台上,流媒体下载和播放是移动应用开发中的常见需求,特别是在视频和音频服务领域。这个项目资源“Android项目流媒体线程下载,播放,(支持断点).rar”显然是一个针对这一主题的实例,旨在教授如何在...

    android断点下载实现

    在Android平台上,断点下载是一项重要的技术,它允许用户在中断网络连接后,从上次停止的位置继续下载大文件,如应用程序、音乐或视频。本文将深入探讨如何在Android中使用HTTP请求来实现这一功能。 首先,理解断点...

    android版的断点下载

    在Android平台上实现断点下载是一项常见的任务,尤其对于那些处理大型文件,如应用程序、游戏或视频的开发者来说。断点下载允许用户在不完整的下载过程中暂停,并在稍后的时间点继续,无需重新开始整个下载过程。这...

    多线程断点下载

    在提供的压缩包文件"down"中,可能包含了一个实现多线程断点下载功能的示例代码或库。通过研究和理解这段代码,开发者可以学习如何在自己的项目中实现类似的功能,提升用户的下载体验。 总之,多线程断点下载是提高...

    多线程断点续传下载实现

    这一技术主要应用于大型文件的下载场景,如游戏、应用程序或高清视频等,它允许用户在下载过程中随时暂停,之后能从中断的地方继续下载,而不需要重新开始。以下是关于这个主题的详细知识点: 1. **多线程下载**: ...

    android 提供的支持断点续传的文件下载器.zip

    在Android开发中,文件下载是常见的需求之一,尤其在处理大型资源如图片、视频、PDF文档或应用程序(APK)时。"android 提供的支持断点续传的文件下载器"是一个专门解决这一问题的工具,它允许用户在下载过程中随时...

    http ftp 断点下载

    本文将详细介绍http和ftp断点下载的原理和实现方法。 一、http断点续传 1. http协议基础:HTTP(超文本传输协议)是一种应用层协议,用于客户端和服务器之间的数据交换。在默认情况下,HTTP下载不支持断点续传,...

    IOS 多线程异步下载,断点续传

    在iOS开发中,多线程异步下载是提高用户体验的关键技术之一。特别是在处理大文件,如应用程序更新或视频下载时,使用多线程可以避免阻塞主线程,保证用户界面的流畅性。断点续传功能则使得用户在下载过程中可以随时...

    2.VT调试器之无限硬件断点.rar

    压缩包内的"2.VT调试器之无限硬件断点.mp4"视频教程,很可能详细演示了如何在VT调试器中设置和使用无限硬件断点,包括如何选择断点位置、查看断点状态、控制断点行为,以及如何利用这一特性进行复杂的程序分析。...

Global site tag (gtag.js) - Google Analytics