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