Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 397|回复: 0

[网络编程学习]http断点续传简单实现

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-30 00:00:15 | 显示全部楼层 |阅读模式
    启动5个线程的运行情况:
    C:java>java TestMethod
    1091
    Thread 0 , nStartPos = 0, nEndPos = 218
    Thread 1 , nStartPos = 218, nEndPos = 436
    Thread 2 , nStartPos = 436, nEndPos = 654
    Thread 3 , nStartPos = 654, nEndPos = 872
    Thread 4 , nStartPos = 872, nEndPos = 1091
    bytes=0-
    bytes=218-
    bytes=436-
    bytes=654-
    bytes=872-
    Thread 0 is over!
    Thread 1 is over!
    Thread 4 is over!
    Thread 2 is over!
    Thread 3 is over!
    文件下载结束!  
       
      
    主要代码:(其它请下载)
    1. /*
    2. **SiteFileFetch.java
    3. */
    4. import java.io.*;
    5. import java.net.*;


    6. public class SiteFileFetch extends Thread {


    7.   SiteInfoBean siteInfoBean = null; //文件信息Bean
    8.   long[] nStartPos; //开始位置
    9.   long[] nEndPos; //结束位置
    10.   FileSplitterFetch[] fileSplitterFetch; //子线程对象
    11.   long nFileLength; //文件长度
    12.   boolean bFirst = true; //是否第一次取文件
    13.   boolean bStop = false; //停止标志
    14.   File tmpFile; //文件下载的临时信息
    15.   DataOutputStream output; //输出到文件的输出流

    16.   //负责整个文件的抓取,控制内部线程(FileSplitterFetch类)
    17.   public SiteFileFetch(SiteInfoBean bean) throws IOException{
    18.      siteInfoBean = bean;
    19.      //tmpFile = File.createTempFile ("zhong","1111",new File(bean.getSFilePath()));
    20.      tmpFile = new File(bean.getSFilePath()+File.separator + bean.getSFileName()+".info");
    21.      if(tmpFile.exists ()){
    22.            bFirst = false;
    23.            read_nPos();//读取已下载的文件信息,断点续传
    24.      }else{
    25.         nStartPos = new long[bean.getNSplitter()];
    26.         nEndPos = new long[bean.getNSplitter()];
    27.       }

    28. }


    29. public void run(){
    30.    //获得文件长度
    31.    //分割文件
    32.    //实例FileSplitterFetch
    33.   //启动FileSplitterFetch线程
    34.   //等待子线程返回
    35. try{
    36.     if(bFirst){
    37.        nFileLength = getFileSize();
    38.        if(nFileLength == -1){
    39.          System.err.println("File Length is not known!");
    40.        }else if(nFileLength == -2){
    41.         System.err.println("File is not access!");
    42.        }else{
    43.          for(int i=0;i< nStartPos.length;i++){
    44.              nStartPos[i] = (long)(i*(nFileLength/nStartPos.length));
    45.           }
    46.          for(int i=0;i< nEndPos.length-1;i++){
    47.           nEndPos[i] = nStartPos[i+1];
    48.          }
    49.          nEndPos[nEndPos.length-1] = nFileLength;
    50.         }
    51.      }


    52.     //启动子线程
    53.      fileSplitterFetch = new FileSplitterFetch[nStartPos.length];
    54.      for(int i=0;i< nStartPos.length;i++){
    55.         fileSplitterFetch[i] = new FileSplitterFetch(siteInfoBean.getSSiteURL(),
    56.          siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(), nStartPos[i],nEndPos[i],i);
    57.         Utility.log("Thread " + i + " , nStartPos = " + nStartPos[i] + ", nEndPos = " + nEndPos[i]);
    58.          fileSplitterFetch[i].start();
    59.       }
    60.     // fileSplitterFetch[nPos.length-1] = new FileSplitterFetch(siteInfoBean.getSSiteURL(),
    61.    siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(),nPos[nPos.length-1],nFileLength,nPos.length-1);
    62.     // Utility.log("Thread " + (nPos.length-1) + " , nStartPos = " + nPos[nPos.length-1] + ",nEndPos = " + nFileLength);
    63.     // fileSplitterFetch[nPos.length-1].start();


    64.    //等待子线程结束
    65.    //int count = 0;
    66.    //是否结束while循环
    67.    boolean breakWhile = false;


    68.    while(!bStop){
    69.      write_nPos();//记录每个线程的下载情况
    70.      Utility.sleep(500);
    71.      breakWhile = true;


    72.     for(int i=0;i< nStartPos.length;i++){
    73.        if(!fileSplitterFetch[i].bDownOver){
    74.           breakWhile = false;
    75.           break;
    76.       }
    77.     }
    78.     if(breakWhile)
    79.        break;
    80.    }

    81.     System.err.println("文件下载结束!");
    82. }catch(Exception e){
    83.     e.printStackTrace ();
    84. }
    85. }


    86. //获得文件长度
    87. public long getFileSize(){
    88.    // System.out.println("Ok");
    89.     int nFileLength = -1;
    90.     try{
    91.      URL url = new URL(siteInfoBean.getSSiteURL());
    92.      HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection ();
    93.      httpConnection.setRequestProperty("User-Agent","NetFox");
    94.      int responseCode=httpConnection.getResponseCode();
    95.      if(responseCode>=400){
    96.          processErrorCode(responseCode);
    97.          return -2; //-2 represent access is error
    98.       }


    99.      String sHeader;


    100.      for(int i=1;;i++){
    101.        //DataInputStream in = new DataInputStream(httpConnection.getInputStream ());
    102.        //Utility.log(in.readLine());
    103.        sHeader=httpConnection.getHeaderFieldKey(i);
    104.        if(sHeader!=null){
    105.           if(sHeader.equals("Content-Length")){
    106.                  nFileLength = Integer.parseInt(httpConnection.getHeaderField(sHeader));
    107.                  //System.out.println("OK"+nFileLength);
    108.                  break;
    109.            }
    110.         }else
    111.            break;
    112.        }
    113.    }catch(IOException e){e.printStackTrace ();
    114.    }catch(Exception e){e.printStackTrace ();}


    115.     Utility.log(nFileLength);


    116.     return nFileLength;
    117. }


    118. //保存下载信息(文件指针位置)
    119. private void write_nPos(){
    120.   try{
    121.      output = new DataOutputStream(new FileOutputStream(tmpFile));
    122.      output.writeInt(nStartPos.length);
    123.      for(int i=0;i< nStartPos.length;i++){
    124. //output.writeLong(nPos[i]);
    125.    output.writeLong(fileSplitterFetch[i].nStartPos);
    126.     output.writeLong(fileSplitterFetch[i].nEndPos);
    127.       }
    128.       output.close();
    129. }catch(IOException e){e.printStackTrace ();}
    130. catch(Exception e){e.printStackTrace ();}
    131. }


    132. //读取保存的下载信息(文件指针位置)
    133. private void read_nPos(){
    134. try{
    135.     DataInputStream input = new DataInputStream(new FileInputStream(tmpFile));
    136.     int nCount = input.readInt();
    137.     nStartPos = new long[nCount];
    138.     nEndPos = new long[nCount];
    139.     for(int i=0;i< nStartPos.length;i++){
    140.       nStartPos[i] = input.readLong();
    141.       nEndPos[i] = input.readLong();
    142.     }
    143.     input.close();
    144.   }catch(IOException e){e.printStackTrace ();}
    145.     catch(Exception e){e.printStackTrace ();}
    146. }


    147. private void processErrorCode(int nErrorCode)
    148. {
    149.    System.err.println("Error Code : " + nErrorCode);
    150. }


    151. //停止文件下载
    152. public void siteStop(){
    153.    bStop = true;
    154.    for(int i=0;i< nStartPos.length;i++)
    155.       fileSplitterFetch[i].splitterStop();


    156.   }
    157. }
    复制代码


      
      
       
       

         
       

         
       
      
    复制代码


    源码下载:http://file.javaxxz.com/2014/10/30/000015203.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-5 08:50 , Processed in 0.387588 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表