仿迅雷下载项目分析
一,下載項目分析:
1,單線程下載:網(wǎng)絡(luò) 流2,多線程下載a,每個線程下載多少數(shù)據(jù)。 文件總大小%線程數(shù)==0? 文件總大小%線程數(shù):文件總大小/線程數(shù)+1;b,某個請從資源 的某個位置下載 => http協(xié)議請求頭 Range: byte=xxx-xxc,在下載前,取出要下載的文件的大小,并在本地建立一個同大小的文件。RanddomAccessFilesetFileSize();d,如何讓線程找到文件的指定位置寫入RanddomAccessFileseek(int position) 3,斷點續(xù)傳a,將沒下完的文件記錄到 屬性文件/XML文件4,迅雷最新的技術(shù);多服務(wù)器下載,從不同的服務(wù)器找到文件源進(jìn)行下載。 vip客戶這個項目主要是實現(xiàn)了第2個方案:XunleiTest類:這個是測試類,設(shè)置了參數(shù):URL: 下載的目的地址threadCount: 線程數(shù)DownLoadManager: 創(chuàng)建的下載管理類然后調(diào)用其download()方法:值得一提的是在調(diào)用這個方法時,同時實現(xiàn)了OnSizeChanged接口這個接口是用來實時顯示已經(jīng)下載了多少數(shù)據(jù),即進(jìn)度是多少,采用的是回調(diào)函數(shù)的形式。里面是靠total不斷的累加得到的數(shù)據(jù)和,這個total要定義成全局靜態(tài)的,要不就達(dá)不到數(shù)據(jù)變化的效果DownLoadManager類:download()方法:參數(shù)說明 url:要下載的文件的url threadCount :線程數(shù) Directory:保存的目錄位置 OnSizeChanged:下載的數(shù)據(jù)量1,取出文件大小 getFileSize(url):A,通過 openConnection()建立連接B,注意:在此方法中因為只需要知道獲得文件的大小,所以setRequestMethod()設(shè)置為HEADC,getResponseCode()獲取服務(wù)器的響應(yīng)碼要是為200,則表示訪問成功D,getContentLength()接受其文件的大小2, 將下載的文件重新命名 genFileName():A,取到當(dāng)前的時間到秒B,通過url.getFile()取到下載的文件的名字,通過截取的方式保留文件的后綴名3,創(chuàng)建文件:gen():用來創(chuàng)建一個新的文件帶保存地址和名字如果有保存的地址則如果有保存的地址則用有的,如果沒有則通過System.getProperty("user.dir");用系統(tǒng)默認(rèn)的。createSaveFile():用來在劃分一個空間,用來以后接受下載時接受數(shù)據(jù);//RandomAccessFile:此類的實例支持對隨機(jī)訪問文件的讀取和寫入.隨機(jī)訪問文件的行為類似存儲在文件系統(tǒng)中的一個大型 byte 數(shù)組//"rwd" 打開以便讀取和寫入,對于 "rw",還要求對文件內(nèi)容的每個更新都同步寫入到底層存儲設(shè)備。RandomAccessFile raf=new RandomAccessFile(saveFile, "rwd");4:每個線程需要下載的長度 getSizePerThread();文件總大小%線程數(shù)==0? 文件總大小%線程數(shù):文件總大小/線程數(shù)+15,根據(jù)線程數(shù)threadCount啟動線程 DownLoadService并將這些參數(shù)傳過去:URL:下載地址i: 當(dāng)前線程sizePerThread:該線程要下載的長度savefile:保存的文件onSizeChanged:下載的變化量DownLoadService類是一個實現(xiàn)了Runnable接口的一個類:run():A,計算當(dāng)前的線程的起始位置 startB,計算當(dāng)前的線程的終點位置 endC,建立與資源的連接:這里的setRequestMethod()用"GET",因為要正式下載其內(nèi)容了注意:需要設(shè)置下載時的長度//設(shè)置一般請求屬性 鍵 值setRequestProperty("Range", "bytes="+start+"-"+end)//HTPP屬性: Range 字節(jié)范圍D,用字節(jié)輸入流接受數(shù)據(jù) InputStreamE,創(chuàng)建RandomAccessFile注意:為了能點對點的將數(shù)據(jù)精確插入這里使用了RandomAccessFile.seek(start);F,進(jìn)入循環(huán)將流寫到本地,并且其實回傳onSizeChanged即顯示的進(jìn)度量具體代碼:
package com.yc.bean3.xunleixaizai;
import java.io.IOException;
import java.net.URL;
public class XunleiTest {
static long total=0; /*** @param args* @throws IOException */ public static void main(String[] args) throws IOException {URL url=new URL("http://yze.t.sogou.com/installpage/sogougmoh.e?dn=ThunderSpeed_1.0.32.350_XiaZaiBa_sgdl.exe");int threadCount=4;DownLoadManager dlm=new DownLoadManager();dlm.download(url, threadCount, null, new OnSizeChanged(){@Overridepublic void nofiySizeChange(long size) {total+=size;System.out.println("已經(jīng)下載了:"+total+"字節(jié)");}}); }}
package com.yc.bean3.xunleixaizai;
public interface OnSizeChanged {
public void nofiySizeChange(long size);}
package com.yc.bean3.xunleixaizai;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DownLoadManager {
//下載方法: url:要下載的文件的url threadCount :線程數(shù) Directory:保存的目錄位置
public void download(URL url,int threadCount,File Directory, OnSizeChanged onSizeChanged) throws IOException{
long filesize=-1;
}
package com.yc.bean3.xunleixaizai;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
public class DownLoadService implements Runnable {
private URL url;
private int i;
private long sizePerThread;
private File savefile;
private boolean flag;
private OnSizeChanged onSizeChanged;
}
總結(jié)
- 上一篇: 《游戏引擎架构》中英词汇索引表
- 下一篇: OSPF路由协议实验配置命令