2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩52頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  本科畢業(yè)設(shè)計(jì)(論文)</p><p><b> ?。ǘ?屆)</b></p><p>  基于Java的下載工具的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  所在學(xué)院 </p><p>  專業(yè)班級(jí) 計(jì)算機(jī)科學(xué)與技術(shù) </p

2、><p>  學(xué)生姓名 學(xué)號(hào) </p><p>  指導(dǎo)教師 職稱 </p><p>  完成日期 年 月 </p><p>  摘要:本設(shè)計(jì)采用Java設(shè)計(jì)一個(gè)具有斷點(diǎn)續(xù)傳和多線程下載功能的下載工具。整體使用Java

3、語(yǔ)言編寫,實(shí)現(xiàn)其基本功能,并在MyEclipse平臺(tái)上運(yùn)行。能對(duì)指定的資源進(jìn)行下載,并解決資源下載中斷時(shí),不能在原有的基礎(chǔ)上繼續(xù)下載,以及下載速度偏低等問(wèn)題。本設(shè)計(jì)實(shí)現(xiàn)了基本GUI操作界面,操作簡(jiǎn)單。但是下載文件路徑需要指定是個(gè)問(wèn)題,需要改進(jìn)。當(dāng)然還有許多問(wèn)題也待完善。</p><p>  關(guān)鍵字:Java;多線程;斷點(diǎn)續(xù)傳;Swing</p><p>  The Design and I

4、mplementation of Downloading tool based on Java</p><p>  Abstract: This design use Java to write which has the Multithread Download and Resume Broken Transfer functions. Use the Java language to achieve its

5、basic functions on the MyEclipse platform. It can download the appointed files, also give the solution to download interruption and download speed due to fast problems. This design achieved an easy GUI interface, simple

6、operation is required. But the download path must be specified is a problem, should be improved. Also many other problems may nee</p><p>  Keywords:Java; Multithreading; Swing; Resume broken transfer</p&

7、gt;<p><b>  目錄</b></p><p><b>  1. 引言1</b></p><p>  1.1 系統(tǒng)背景1</p><p>  1.2 系統(tǒng)意義1</p><p>  1.3 網(wǎng)絡(luò)構(gòu)架2</p><p><b>  2.

8、系統(tǒng)分析2</b></p><p>  2.1 設(shè)計(jì)概述2</p><p>  2.1.1 設(shè)計(jì)目標(biāo)2</p><p>  2.1.2 開發(fā)環(huán)境3</p><p>  2.2. 相關(guān)主要技術(shù)簡(jiǎn)介3</p><p>  2.2.1 Java語(yǔ)言簡(jiǎn)介3</p><p>  2

9、.2.2 多線程技術(shù)簡(jiǎn)介3</p><p>  2.2.3 HTTP1.0協(xié)議4</p><p>  2.2.4 斷點(diǎn)續(xù)傳的技術(shù)4</p><p>  2.3 可行性分析5</p><p>  2.3.1 技術(shù)可行性分析5</p><p>  2.3.2 經(jīng)濟(jì)可行性分析6</p><p&

10、gt;  2.3.3 操作可行性分析7</p><p><b>  3. 概要設(shè)計(jì)8</b></p><p>  3.1 系統(tǒng)結(jié)構(gòu)圖9</p><p>  3.2 功能流程圖9</p><p>  4. 詳細(xì)設(shè)計(jì)10</p><p>  4.1 獲取網(wǎng)絡(luò)資源10</p>

11、<p>  4.1.1 功能說(shuō)明11</p><p>  4.1.2 設(shè)計(jì)說(shuō)明11</p><p>  4.1.3 核心代碼12</p><p>  4.2 線程任務(wù)分配12</p><p>  4.2.1 功能說(shuō)明13</p><p>  4.2.2 設(shè)計(jì)說(shuō)明13</p><

12、p>  4.2.3 設(shè)計(jì)流程13</p><p>  4.3 創(chuàng)建下載任務(wù)13</p><p>  4.4 任務(wù)下載13</p><p>  4.4.1 功能說(shuō)明15</p><p>  4.4.2 設(shè)計(jì)說(shuō)明15</p><p>  4.4.3 核心流程19</p><p> 

13、 4.5 事件監(jiān)聽器設(shè)計(jì)20</p><p>  4.5.1 功能說(shuō)明20</p><p>  4.5.2 設(shè)計(jì)說(shuō)明21</p><p>  4.6 下載控制器設(shè)計(jì)21</p><p>  4.6.1 功能說(shuō)明22</p><p>  4.6.2 設(shè)計(jì)說(shuō)明22</p><p>  4

14、.6.3 功能流程27</p><p>  4.7 顯示控制器設(shè)計(jì)26</p><p>  4.7.1 功能說(shuō)明26</p><p>  4.7.2 設(shè)計(jì)說(shuō)明26</p><p>  4.8 斷點(diǎn)記錄文件設(shè)計(jì)28</p><p>  4.8.1 功能說(shuō)明27</p><p>  4.

15、8.2 設(shè)計(jì)說(shuō)明27</p><p>  4.8.3 保存斷點(diǎn)線程流程圖28</p><p>  4.9 文件操作28</p><p>  4.9.1 功能說(shuō)明28</p><p>  4.9.2 設(shè)計(jì)說(shuō)明30</p><p>  4.9.3 文件操作流程30</p><p>  4

16、.10 GUI界面設(shè)計(jì)31</p><p>  4.10.1 功能說(shuō)明31</p><p>  4.10.2 設(shè)計(jì)說(shuō)明31</p><p>  5. 設(shè)計(jì)問(wèn)題總結(jié)34</p><p>  5.1 斷點(diǎn)設(shè)置問(wèn)題34</p><p>  5.2 下載速度統(tǒng)計(jì)問(wèn)題34</p><p>&l

17、t;b>  致 謝36</b></p><p><b>  參考文獻(xiàn)資料36</b></p><p><b>  1. 引言</b></p><p><b>  1.1 系統(tǒng)背景</b></p><p>  隨著互聯(lián)網(wǎng)應(yīng)用范圍不斷發(fā)展,網(wǎng)絡(luò)包含的信息資源日

18、益增多,互聯(lián)網(wǎng)用戶可以通過(guò)網(wǎng)絡(luò)下載所需的數(shù)據(jù)資源保存在本地磁盤當(dāng)中,因此相應(yīng)的基于網(wǎng)絡(luò)的下載工具應(yīng)運(yùn)而生。對(duì)于一個(gè)網(wǎng)絡(luò)下載工具,有兩個(gè)問(wèn)題一直阻礙著下載技術(shù)的發(fā)展:速度和下載中斷問(wèn)題。</p><p>  幾年來(lái),下載技術(shù)也在不停地發(fā)展。最原始的下載功能僅僅是個(gè)“下載”過(guò)程,即從WEB服務(wù)器上連續(xù)地讀取文件。其最大的問(wèn)題是,由于網(wǎng)絡(luò)的不穩(wěn)定性,一旦連接斷開使得下載過(guò)程中斷,就不得不全部從頭再來(lái)一次。隨后,“斷點(diǎn)續(xù)

19、傳”的概念就出來(lái)了,顧名思義,就是如果下載中斷,在重新建立連接后,跳過(guò)已經(jīng)下載的部分,而只下載還沒(méi)有下載的部分。</p><p>  在“網(wǎng)絡(luò)螞蟻”軟件流行開后,許多下載軟件也都紛紛效仿,是否具有“多線程下載”技術(shù)、甚至能支持多少個(gè)下載線程都成了人們?cè)u(píng)測(cè)下載軟件的要素?!岸嗑€程下載”的基礎(chǔ)是WEB服務(wù)器支持遠(yuǎn)程的隨機(jī)讀取,也即支持“斷點(diǎn)續(xù)傳”。這樣,在下載時(shí)可以把文件分成若干部分,每一部分創(chuàng)建一個(gè)下載線程進(jìn)行下載

20、。</p><p>  至于多線程下載的原理是這樣的:通常服務(wù)器同時(shí)與多個(gè)用戶連接,用戶之間共享帶寬。如果N個(gè)用戶的優(yōu)先級(jí)都相同,那么每個(gè)用戶連接到該服務(wù)器上的實(shí)際帶寬就是服務(wù)器帶寬的N分之一??梢韵胂螅绻脩魯?shù)目較多,則每個(gè)用戶只能占有可憐的一點(diǎn)帶寬,下載將會(huì)是個(gè)漫長(zhǎng)的過(guò)程。但是伴隨著基于網(wǎng)絡(luò)的多線程下載技術(shù)的出現(xiàn),如今的下載工具徹底擺脫了這兩個(gè)問(wèn)題的束縛并且向著更為人性化的方面發(fā)展下去。</p>

21、<p><b>  1.2 系統(tǒng)意義</b></p><p>  本系統(tǒng)是開發(fā)一個(gè)簡(jiǎn)單的多線程下載工具,實(shí)現(xiàn)資源的多線程下載,同時(shí)實(shí)現(xiàn)斷點(diǎn)續(xù)傳的功能。實(shí)現(xiàn)這么一個(gè)下載最大的意義是探索多線程下載的基本原理,綜合運(yùn)用大學(xué)四年所學(xué)的知識(shí),提高自己的動(dòng)手能力,及查閱資料繼續(xù)學(xué)習(xí)的能力,也是四年學(xué)習(xí)成果的展示,并完成學(xué)校的畢業(yè)設(shè)計(jì)任務(wù)。其次就是為用戶提供一個(gè)操作簡(jiǎn)單、功能齊全的下載工具,

22、使用戶能更好的獲取網(wǎng)絡(luò)資源。</p><p>  多線程和傳統(tǒng)的單線程在程序設(shè)計(jì)上最大的區(qū)別在于,由于各個(gè)線程的控制流彼此獨(dú)立,使得各個(gè)線程之間的代碼亂序執(zhí)行,由此帶來(lái)的線程調(diào)度問(wèn)題。由于是多線程進(jìn)行斷點(diǎn)續(xù)傳,還要考慮記錄多個(gè)斷點(diǎn)位置,且記錄斷點(diǎn)位置時(shí)也要考慮同步互斥等問(wèn)題。所有這些都使得這一步比較復(fù)雜。但是可以明顯提高網(wǎng)絡(luò)文件的下載速度。</p><p><b>  1.3 網(wǎng)

23、絡(luò)構(gòu)架</b></p><p>  網(wǎng)絡(luò)下載基本構(gòu)架主要包括兩種:C/S與P2P架構(gòu)。傳統(tǒng)的C/S網(wǎng)絡(luò)發(fā)展出了HTTP/FTP下載,并在客戶端發(fā)展出了多線程下載方式。而P2P網(wǎng)絡(luò)則發(fā)展出了BT、eMule這樣的多源文件傳輸方式。</p><p>  傳統(tǒng)的HTTP/FTP下載方式都是屬于C/S架構(gòu),即客戶端/服務(wù)器架構(gòu)。這種模式的基本方法是將共享文件上傳服務(wù)器上,而需要這些文件

24、的用戶再向服務(wù)器索取和下載共享文件,也就意味著來(lái)自各個(gè)客戶端的大量的上傳下載數(shù)據(jù)都必須經(jīng)過(guò)服務(wù)器這個(gè)中轉(zhuǎn)站。</p><p>  BT協(xié)議則是屬于P2P架構(gòu),即PeertoPeer。雖然對(duì)于P2P并沒(méi)有一個(gè)統(tǒng)一的定義或標(biāo)準(zhǔn),但P2P都有一個(gè)共同點(diǎn)就是充分利用各結(jié)點(diǎn)的資源,形成一個(gè)自組織網(wǎng)絡(luò),在網(wǎng)絡(luò)中每個(gè)結(jié)點(diǎn)都是對(duì)等的,既享受別人的服務(wù)也為別人提供服務(wù),傳輸文件數(shù)據(jù)時(shí)不再需要經(jīng)過(guò)服務(wù)器。</p>&l

25、t;p><b>  2. 系統(tǒng)分析</b></p><p><b>  2.1 設(shè)計(jì)概述</b></p><p>  對(duì)于一個(gè)多線程下載工具的設(shè)計(jì),首先就是要設(shè)定好實(shí)現(xiàn)的目標(biāo),確定開發(fā)的環(huán)境。只有明確了目標(biāo)才能知道自己要做什么,思路更清楚。而一個(gè)好的開發(fā)環(huán)境對(duì)提高開發(fā)的效率起著很重要的作用。</p><p>  2.

26、1.1 設(shè)計(jì)目標(biāo)</p><p>  實(shí)現(xiàn)一個(gè)實(shí)用的多任務(wù),多線程下載工具。具備以下功能:</p><p>  (1)實(shí)現(xiàn)一個(gè)簡(jiǎn)潔的易操作的GUI界面。</p><p>  (2)實(shí)現(xiàn)新建下載任務(wù)的功能。</p><p>  (3)下載過(guò)程實(shí)現(xiàn)多任務(wù),多線程的功能。</p><p>  (4)實(shí)現(xiàn)任務(wù)暫停,及恢復(fù)下載的

27、功能。</p><p>  (5)實(shí)現(xiàn)停止任務(wù)功能。</p><p>  2.1.2 開發(fā)環(huán)境</p><p>  MyEclipse,Windows XP</p><p>  2.2. 相關(guān)主要技術(shù)簡(jiǎn)介</p><p>  簡(jiǎn)略的介紹下系統(tǒng)開發(fā)過(guò)程中用到的相關(guān)技術(shù)。如Java語(yǔ)言、多線程技術(shù)、HTTP1.0協(xié)議、斷點(diǎn)

28、續(xù)傳技術(shù)等。</p><p>  2.2.1 Java語(yǔ)言簡(jiǎn)介</p><p>  Java是一種簡(jiǎn)單、面向?qū)ο?、分布式、解釋型、健壯安全、結(jié)構(gòu)中立、可移植、性能優(yōu)異、多線程的語(yǔ)言,自1995年SUN推出JAVA語(yǔ)言后,全世界的目光都被這個(gè)神奇的語(yǔ)言所吸引。由于Java所具有的以上那些特性,并且在大學(xué)里也學(xué)習(xí)了兩個(gè)學(xué)期,對(duì)這門語(yǔ)言比較熟悉。所以選用JAVA作為本次畢業(yè)設(shè)計(jì)的開發(fā)語(yǔ)言。<

29、;/p><p>  2.2.2 多線程技術(shù)簡(jiǎn)介</p><p>  線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨(dú)立執(zhí)行。也可以把它理解為代碼運(yùn)行的上下文。所以線程基本上是輕量級(jí)的進(jìn)程,它負(fù)責(zé)在單個(gè)程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。利用線程,用戶可按下一個(gè)按鈕,然后程序會(huì)立即做出響應(yīng),而不是讓用戶等待程序完成當(dāng)前任務(wù)以后再做出響應(yīng)。</p>&

30、lt;p>  線程可以理解為下載的通道,一個(gè)線程就是一個(gè)文件的下載通道,多線程也就是同時(shí)開起好幾個(gè)下載通道.當(dāng)服務(wù)器提供下載服務(wù)時(shí),使用下載者是共享帶寬的,在優(yōu)先級(jí)相同的情況下,總服務(wù)器會(huì)對(duì)總下載線程進(jìn)行平均分配。線程越多,下載速度越快。當(dāng)前的下載軟件都支持多線程技術(shù)。</p><p>  在本次設(shè)計(jì)中,多線程技術(shù)用在新建任務(wù)和下載過(guò)程上,在系統(tǒng)中可以開起多個(gè)下載線程下載同一網(wǎng)絡(luò)上的資源而互不干擾?;ゲ桓蓴_

31、也是相對(duì)的,首先下載的資源不能重復(fù),其次如何合理的分解整個(gè)資源,使得有相應(yīng)的線程對(duì)其進(jìn)行下載,下載結(jié)束后如何將資源重新整合等。線程的運(yùn)行在操作系統(tǒng)的調(diào)度下,各自得到一定的時(shí)間片,當(dāng)某一線程獲取到時(shí)間片時(shí),它就進(jìn)入運(yùn)行狀態(tài)。各個(gè)線程按照一定的協(xié)議分別獲取時(shí)間片。</p><p>  當(dāng)對(duì)一個(gè)復(fù)雜對(duì)象進(jìn)行某種操作時(shí),從操作開始到操作結(jié)束,被操作的對(duì)象往往會(huì)經(jīng)歷若干非法的中間狀態(tài)。調(diào)用一個(gè)函數(shù)(假設(shè)該函數(shù)是正確的)操作

32、某對(duì)象常常會(huì)使該對(duì)象暫時(shí)陷入不可用的狀態(tài)(通常稱為不穩(wěn)定狀態(tài)),等到操作完全結(jié)束,該對(duì)象才會(huì)重新回到完全可用的狀態(tài)。如果其他線程企圖訪問(wèn)一個(gè)處于不可用狀態(tài)的對(duì)象,該對(duì)象將不能正確響應(yīng)從而產(chǎn)生無(wú)法預(yù)料的結(jié)果,如何避免這種情況發(fā)生是線程安全性的核心問(wèn)題。</p><p>  線程同步提供了保證不同線程按適當(dāng)順序使用共享資源的工具。線程可直接訪問(wèn)共享數(shù)據(jù),既有相互之間高效通信的優(yōu)點(diǎn),也有線程間任意相互干擾的弊端。安全的

33、多線程數(shù)據(jù)使用方案要求不同線程處理不同的數(shù)據(jù),即多個(gè)線程不能共享臨界區(qū)。例如:有10張車票供2個(gè)顧客預(yù)定,而又要求2個(gè)顧客盡可能多地預(yù)定10張車票,這10張車票作為共享資源,可能導(dǎo)致1張票預(yù)定給2個(gè)顧客的情況,針對(duì)這種情況,設(shè)計(jì)時(shí)應(yīng)采用正確的同步機(jī)制。</p><p>  若2個(gè)線程同步執(zhí)行時(shí)需要相互打開,就會(huì)出現(xiàn)1個(gè)線程依賴于另1個(gè)要打開的線程而形成死鎖。它不是資源不夠引起的,而是由線程的調(diào)度引起的。對(duì)于死鎖可

34、用下述方法解決:</p><p> ?。?)嘗試在盡可能短的時(shí)間內(nèi)執(zhí)行鎖定的代碼,占用時(shí)間越長(zhǎng),另一線程出現(xiàn)和需要對(duì)象的可能性越大。</p><p> ?。?)當(dāng)我們從另一個(gè)被同步的方法中激活被同步的方法時(shí)要小心,最好是清楚地定義每個(gè)線程的任務(wù),并考慮使用什么數(shù)據(jù)和什么時(shí)候使用。</p><p>  總之,在多線程程序設(shè)計(jì)中,要充分考慮各種可能出現(xiàn)的情況,并用適當(dāng)?shù)?/p>

35、方法給予解決,使線程在運(yùn)行過(guò)程中按所預(yù)期定義的目標(biāo)進(jìn)行。</p><p>  2.2.3 HTTP1.0協(xié)議</p><p>  HTTP是Web協(xié)議集中的重要協(xié)議,它是從客戶機(jī)/服務(wù)器模型發(fā)展起來(lái)的??蛻魴C(jī)/服務(wù)器是運(yùn)行一對(duì)相互通信的程序,客戶與服務(wù)器連接時(shí),首先,向服務(wù)器提出請(qǐng)求,服務(wù)器根據(jù)客戶的請(qǐng)求,完成處理并給出響應(yīng)。瀏覽器就是與Web服務(wù)器產(chǎn)生連接的客戶端程序,它的端口為TCP的

36、80端口。舉一個(gè)大家都很常見(jiàn)的例子,瀏覽器與Web服務(wù)器之間所遵循的協(xié)議就是HTTP。</p><p>  Web的應(yīng)用層協(xié)議HTTP是Web的核心。HTTP在Web的客戶程序和服務(wù)器程序中得以實(shí)現(xiàn)。運(yùn)行在不同端系統(tǒng)上的客戶程序和服務(wù)器程序通過(guò)交換HTTP消息交流。HTTP定義這些消息的結(jié)構(gòu)以及客戶和服務(wù)器如何交換這些消息。HTTP定義Web客戶(即瀏覽器)如何從Web服務(wù)器請(qǐng)求Web頁(yè)面,以及服務(wù)器如何把Web

37、頁(yè)面?zhèn)魉徒o客戶。</p><p>  HTTP1.0(Hypertext Transfer Protocol Vertion 1.0)超文本傳輸協(xié)議1.0。</p><p>  超文本傳輸協(xié)議(HTTP)是一種應(yīng)用層協(xié)議與速度分布必要的協(xié)作超媒體信息系統(tǒng)。這是一種一般、無(wú)狀態(tài)的、面向?qū)ο蟮膮f(xié)議,可用于多種任務(wù),例如域名服務(wù)器和分布式對(duì)象管理系統(tǒng),通過(guò)它的請(qǐng)求方法(命令)的延伸。一種特征HT

38、TP是代表性的數(shù)據(jù)輸入,使系統(tǒng)的獨(dú)立于數(shù)據(jù)生成轉(zhuǎn)移HTTP。它是用來(lái)在Internet上傳送超文本的傳送協(xié)議。它是運(yùn)行在TCP/IP協(xié)議族之上的HTTP應(yīng)用協(xié)議,它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。任何服務(wù)器除了包括HTML文件以外,還有一個(gè)HTTP駐留程序,用于響應(yīng)用戶請(qǐng)求。您的瀏覽器是HTTP客戶,向服務(wù)器發(fā)送請(qǐng)求,當(dāng)瀏覽器中輸入了一個(gè)開始文件或點(diǎn)擊了一個(gè)超級(jí)鏈接時(shí),瀏覽器就向服務(wù)器發(fā)送了HTTP請(qǐng)求,此請(qǐng)求被送往由IP地址指定

39、的URL。駐留程序接收到請(qǐng)求,在進(jìn)行必要的操作后回送所要求的文件。[1]</p><p>  2.2.4 斷點(diǎn)續(xù)傳的技術(shù)</p><p>  在當(dāng)今的網(wǎng)絡(luò)時(shí)代,下載軟件是使用最為頻繁的軟件之一。幾年來(lái),下載技術(shù)也在不停地發(fā)展。最原始的下載功能僅僅是個(gè)“下載過(guò)程”,即從WEB服務(wù)器上連續(xù)地讀取文件。其最大的問(wèn)題是,由于網(wǎng)絡(luò)的不穩(wěn)定性,一旦連接斷開使得下載過(guò)程中斷,就不得不全部從頭再來(lái)一次。隨

40、后,“斷點(diǎn)續(xù)傳”的概念就出來(lái)了,顧名思義,就是如果下載中斷,在重新建立連接后,跳過(guò)已經(jīng)下載的部分,而只下載還沒(méi)有下載的部分。多線程下載的基礎(chǔ)是WEB服務(wù)器支持遠(yuǎn)程的隨機(jī)讀取,也即支持“斷點(diǎn)續(xù)傳”。這樣,在下載時(shí)可以把文件分成若干部分,每一部分創(chuàng)建一個(gè)下載線程進(jìn)行下載。這項(xiàng)技術(shù)在關(guān)機(jī)或者網(wǎng)絡(luò)出錯(cuò)的情況下不僅能完整的保護(hù)你已下載的部分,還能使你重新連接下載時(shí)繼續(xù)下載未完成的部分。</p><p>  2.3 可行性分

41、析 </p><p>  可行性分析是通過(guò)對(duì)項(xiàng)目的主要內(nèi)容和配套條件進(jìn)行調(diào)查研究和分析比較,并對(duì)項(xiàng)目建成以后可能取得的經(jīng)濟(jì)效益及社會(huì)環(huán)境影響進(jìn)行預(yù)測(cè),從而提出該項(xiàng)目是否值得投資和如何進(jìn)行建設(shè)的咨詢意見(jiàn),為項(xiàng)目決策提供依據(jù)的一種綜合性的系統(tǒng)分析方法。可行性研究應(yīng)具有預(yù)見(jiàn)性、公正性、可靠性、科學(xué)性的特點(diǎn)??尚行匝芯繉?shí)質(zhì)上是要進(jìn)行一次大大壓縮簡(jiǎn)化了的系統(tǒng)分析和設(shè)計(jì)的過(guò)程,也就是在較高層次上以較抽象的方式進(jìn)行的系統(tǒng)分析和

42、設(shè)計(jì)的過(guò)程。它的目的不是解決問(wèn)題,而是確定問(wèn)題是否值得去解決。</p><p>  2.3.1 技術(shù)可行性分析</p><p>  多線程跨平臺(tái)的下載工具的實(shí)現(xiàn)不是很困難,首先是多線程,JAVA語(yǔ)言很好的支持了多線程,其API中的ExecutorService提供了多線程的處理。其次是跨平臺(tái),JAVA語(yǔ)言本身就是平臺(tái)無(wú)關(guān)性的語(yǔ)言,編譯成class的字節(jié)碼文件,不同的平臺(tái)提供不同的JVM,確

43、保了JAVA的跨平臺(tái)性。第三是對(duì)協(xié)議的支持,API中的Java.net.*中提供了對(duì)HTTP支持的方法。最后也是最復(fù)雜的就是Java的圖形化界面,JAVA本身不擅長(zhǎng)圖形化界面,但AWT及Swing也提供了足夠的支持。[2]</p><p>  首先要了解要做個(gè)什么樣的下載工具,對(duì)設(shè)計(jì)的技術(shù)實(shí)現(xiàn)全面的了解??梢圆捎胘ava的多線程機(jī)制,通過(guò)設(shè)置HTTP1.0的請(qǐng)求頭信息,可以實(shí)現(xiàn)連接遠(yuǎn)程資源,通過(guò)這個(gè)連接可以與遠(yuǎn)程

44、資源進(jìn)行交互,這樣就可以實(shí)現(xiàn)多線程及斷點(diǎn)續(xù)傳的功能。所以在技術(shù)上實(shí)現(xiàn)多線程下載是沒(méi)有問(wèn)題。</p><p>  2.3.2 經(jīng)濟(jì)可行性分析</p><p>  贏利不是制作這個(gè)下載工具的目的,而只是為了探索多線程下載的基本原理,綜合運(yùn)用所學(xué)的知識(shí),提高自己的動(dòng)手能力,及查閱資料繼續(xù)學(xué)習(xí)的能力,并完成學(xué)校安排的畢業(yè)設(shè)計(jì),順利完成學(xué)業(yè)。所以它也就不存在經(jīng)濟(jì)的問(wèn)題。而從它的意義上來(lái)說(shuō),絕對(duì)值得制

45、作這個(gè)下載工具。</p><p>  2.3.3 操作可行性分析</p><p>  下載工具應(yīng)面向廣大的互聯(lián)網(wǎng)用戶,所以在設(shè)計(jì)中采用簡(jiǎn)潔的GUI界面。也因?yàn)楹?jiǎn)潔的界面設(shè)計(jì)使得系統(tǒng)在操作方式上很容易讓用戶接受。即使對(duì)一個(gè)沒(méi)有計(jì)算機(jī)操作經(jīng)驗(yàn)的人來(lái)</p><p>  說(shuō)也能順利完成下載,因此在操作上也是行得通的。</p><p><b&g

46、t;  3. 概要設(shè)計(jì)</b></p><p><b>  3.1 系統(tǒng)結(jié)構(gòu)圖</b></p><p>  本系統(tǒng)采用三層結(jié)構(gòu)進(jìn)行系統(tǒng)分層,這三層分別為GUI表現(xiàn)層,控制層,底層下載操作,文件及網(wǎng)絡(luò)操作,系統(tǒng)的結(jié)構(gòu)圖如圖3-1</p><p>  圖3-1 系統(tǒng)結(jié)構(gòu)圖</p><p><b>  3

47、.2 功能流程圖</b></p><p>  新建下載及恢復(fù)下載功能流程圖見(jiàn)圖3-2,新建任務(wù)與恢復(fù)任務(wù)僅是在任務(wù)的構(gòu)建方式上不一樣,在網(wǎng)絡(luò)操作及下載操作上都沒(méi)有什么區(qū)別,這樣的實(shí)現(xiàn)主要得益于對(duì)代碼重用性的設(shè)計(jì)。</p><p>  圖3-2 新建/恢復(fù)任務(wù)流程圖</p><p>  暫停與停止的功能實(shí)現(xiàn)流程圖見(jiàn)圖3-3,從這個(gè)圖中可以發(fā)現(xiàn)和暫停任務(wù),停

48、止任務(wù)一樣具備同樣的代碼利用,停止線程過(guò)程是同一個(gè),他們兩個(gè)在功能上唯一的不同僅是暫停任務(wù)時(shí)需要將暫停的斷點(diǎn)記錄下來(lái),而停止任務(wù)卻是將斷點(diǎn)記錄給刪除,并刪除已下載的部分文件信息。</p><p>  圖3-3暫停/停止任務(wù)流程圖</p><p><b>  4. 詳細(xì)設(shè)計(jì)</b></p><p>  4.1 獲取網(wǎng)絡(luò)資源</p>

49、<p>  獲取網(wǎng)絡(luò)資源是下載過(guò)程中的第一個(gè)步驟,也是很關(guān)鍵的一步。由于網(wǎng)絡(luò)的問(wèn)題是多變的,有可能指定的下載資源已經(jīng)不存在,或者網(wǎng)絡(luò)連接有問(wèn)題,等一系列的問(wèn)題,因此在連接資源過(guò)程中得對(duì)相應(yīng)的連接進(jìn)行測(cè)試,如輸入的URL是否正確或存在、網(wǎng)絡(luò)連接是否正常等。</p><p>  4.1.1 功能說(shuō)明</p><p>  要下載一個(gè)遠(yuǎn)程的資源就需要先定位到指定的資源,并建立連接。在本模

50、塊中實(shí)現(xiàn)的基本功能說(shuō)是與遠(yuǎn)程的資源進(jìn)行連接,并測(cè)試其連接狀態(tài)。</p><p>  4.1.2 設(shè)計(jì)說(shuō)明</p><p>  在做這個(gè)模塊之前得先來(lái)了解下HTTP協(xié)議。HTTP協(xié)議就是超文本傳輸協(xié)議,采用了請(qǐng)求/響應(yīng)模型??蛻舳讼蚍?wù)器發(fā)送一個(gè)請(qǐng)求,請(qǐng)求頭包含請(qǐng)求的方法、URL、協(xié)議版本、以及包含請(qǐng)求修飾符、客戶信息和內(nèi)容的類似于MIME的消息結(jié)構(gòu)。服務(wù)器以一個(gè)狀態(tài)行作為響應(yīng),相應(yīng)的內(nèi)容包

51、括消息協(xié)議的版本,成功或者錯(cuò)誤編碼加上包含服務(wù)器信息,實(shí)體元信息以及可能的實(shí)體內(nèi)容。</p><p><b>  1、連接資源</b></p><p>  通過(guò)JDK的net包中包含的URL及HttpURLConnection兩個(gè)類對(duì)網(wǎng)上資源進(jìn)行操作。URL指定網(wǎng)絡(luò)資源的位置,而HttpURLConnection中則封裝了操作指定網(wǎng)絡(luò)資源的方法。</p>

52、<p>  在本系統(tǒng)中設(shè)計(jì)了類SplitFileTask,它的主要功能就是通過(guò)提供指定的URL獲取HttpURLConnection對(duì)象,為控制層代碼利用HttpURLConnection對(duì)象操作網(wǎng)絡(luò)文件提供支持??刂茖哟a只要調(diào)用SplitFileTask.connection()即可。</p><p><b>  2、測(cè)試連接</b></p><p>

53、  在網(wǎng)絡(luò)連接過(guò)程中可能出現(xiàn)各種各樣的問(wèn)題,而需要的只是連接成功的正確網(wǎng)絡(luò)資源,所以有必要對(duì)通過(guò)SplitFileTask獲取的與服務(wù)器的連接進(jìn)行測(cè)試。如果測(cè)試成功,即能正確獲取到指定的資源,之后才對(duì)指定的資源進(jìn)行下載操作,否則拋棄信息,并對(duì)用戶進(jìn)行相應(yīng)的提示。</p><p>  通過(guò)對(duì)HTTP1.0協(xié)議的了解,知道只要發(fā)送一個(gè)指定的請(qǐng)求頭信息,服務(wù)器就會(huì)返回一個(gè)攜帶著請(qǐng)求后服務(wù)器處理完成的信息,這個(gè)信息就包括

54、請(qǐng)求是否成功等。要做的就是構(gòu)造這樣一個(gè)帶有指定的請(qǐng)求的頭信息發(fā)送到服務(wù)器端,然后查看它返回的響應(yīng)碼,因?yàn)橥瓿煽赡軓捻憫?yīng)碼中去了解一個(gè)請(qǐng)求是否成功。</p><p>  要設(shè)計(jì)一個(gè)什么樣的請(qǐng)求頭才能符合的要求的測(cè)試效果呢?</p><p>  通過(guò)設(shè)計(jì)請(qǐng)求頭信息中的RANGE字段可以指定請(qǐng)求URL指向目標(biāo)資源的偏移量,而不是從頭開始讀。這個(gè)也是斷點(diǎn)及多線程下載資源的一個(gè)重要屬性,將在后面作更

55、詳細(xì)說(shuō)明。如果設(shè)置完這個(gè)頭信息并發(fā)送到服務(wù)器端,如果源請(qǐng)求的資源存在并且服務(wù)器支持?jǐn)帱c(diǎn)續(xù)傳,這時(shí)它返回的響應(yīng)碼信息就是206,如果存在但不支持?jǐn)帱c(diǎn)則返回200,而其它的情況就都是連接失敗的情況了。[3]</p><p>  這樣測(cè)試連接的理論基礎(chǔ)就完成了,那用net包的類怎么設(shè)置請(qǐng)求頭信息,如何獲取響應(yīng)碼信息呢?其實(shí)這些都是很容易的,代碼如下:</p><p>  connection.s

56、etRequestProperty("Range","bytes="+downloaded+"-");設(shè)置請(qǐng)求頭的</p><p><b>  RANGE字段</b></p><p>  connection.getResponseCode();獲取響應(yīng)碼信息。到此,有關(guān)網(wǎng)絡(luò)連接,及測(cè)試連接的設(shè)計(jì)就告一段落了

57、。</p><p>  4.1.3 核心代碼</p><p><b>  (1)獲取連接</b></p><p>  如果獲取網(wǎng)絡(luò)資源出錯(cuò)時(shí)則返回一個(gè)空值</p><p>  HttpURLConnection connection=(HttpURLConnection) url.openConniection();&l

58、t;/p><p>  connection.setRequestProperty("Range","bytes="+downloaded+"-");</p><p><b>  //連接服務(wù)器</b></p><p>  connection.connect();</p>&

59、lt;p><b>  //檢查返回值</b></p><p>  if(connection.getResponseCode()/100!=2){</p><p><b>  error();</b></p><p><b>  }</b></p><p>  //檢查文

60、件是不是有錯(cuò)</p><p>  int contentLength=connection.getContentLength();</p><p>  if(contentLength<1){</p><p><b>  error();</b></p><p><b>  }</b><

61、/p><p><b>  (2)測(cè)試連接</b></p><p>  private URL verifyUrl(String url) {</p><p>  if(!url.toLowerCase().startsWith("http://"))</p><p>  return null;</

62、p><p>  URL verifiedUrl=null;</p><p><b>  try{</b></p><p>  verifiedUrl = new URL(url);</p><p>  }catch(Exception e){</p><p>  return null;</p&

63、gt;<p><b>  }</b></p><p>  if(verifiedUrl.getFile().length()<2)</p><p>  return null;</p><p>  return verifiedUrl;</p><p><b>  }[4]</b>

64、;</p><p>  4.2 線程任務(wù)分配</p><p>  通過(guò)對(duì)http1.0協(xié)議的了解后,知道通過(guò)對(duì)它的請(qǐng)求頭進(jìn)行設(shè)置,就可以獲取到遠(yuǎn)程文件的指定部分,而不用從頭開始下載。利用這個(gè)特性就可以設(shè)計(jì)一個(gè)多線程下載的原型出來(lái)了。要進(jìn)行多線程下載,主要實(shí)現(xiàn)的是為每個(gè)線程分配一個(gè)指定范圍的數(shù)據(jù)下載,那怎么為每一個(gè)下載線程進(jìn)行任務(wù)分配呢?這就是這一節(jié)要討論的內(nèi)容。</p>&l

65、t;p>  4.2.1 功能說(shuō)明</p><p>  在多線程下載過(guò)程中,需要讓每一個(gè)線程都指向指定資源的一部分,且不重復(fù),如何為每一個(gè)下載線程分配它指向的特定部分就是這個(gè)模塊所要完成的任務(wù)。</p><p>  4.2.2 設(shè)計(jì)說(shuō)明</p><p>  確定了采用分塊的形式進(jìn)行任務(wù)的分配,那要考慮的問(wèn)題就只有如何分塊了,如何分配才能準(zhǔn)備無(wú)誤,并且保證各個(gè)下載

66、線程所要下載的任務(wù)更合理。本系統(tǒng)采用的是平均分配的方法。就是為每一個(gè)下載線程分配盡可能相同的字節(jié)數(shù),在這個(gè)過(guò)程中得指定下載任務(wù)相對(duì)于資源起點(diǎn)的偏移量及下載的長(zhǎng)度。分配過(guò)程如下:</p><p>  獲取資源長(zhǎng)度,這個(gè)可以從請(qǐng)求的響應(yīng)信息中獲取“filelength”字段獲得,即通過(guò)tempFile對(duì)象寫入文件信息獲取[5]。根據(jù)線程數(shù)計(jì)算各個(gè)任務(wù)塊的偏移量及下載長(zhǎng)度,這個(gè)過(guò)程簡(jiǎn)單,但得注意字節(jié)重復(fù)的問(wèn)題。<

67、/p><p>  4.2.3 設(shè)計(jì)流程</p><p>  圖4-1 任務(wù)分配流程圖</p><p>  4.3 創(chuàng)建下載任務(wù)</p><p>  有了之前的一系列操作,就可以著手創(chuàng)建下載任務(wù)了,下載任務(wù)有很多不同的狀態(tài)和狀態(tài)信息,這些信息包括URL地址、文件保存路徑、下載文件長(zhǎng)度、任務(wù)狀態(tài)、支持?jǐn)帱c(diǎn)標(biāo)志、下載進(jìn)度、下載狀態(tài)。并在程序里面設(shè)計(jì)一個(gè)

68、類FileInfo描述文件信息,詳細(xì)請(qǐng)看圖。FileInfo包括重寫了的hashCode()方法、以取得下載文件的信息進(jìn)行比較,equals()方法來(lái)驗(yàn)證是否為續(xù)傳文件,通過(guò)傳入對(duì)象的下載文件URL和文件名區(qū)分是否為同一文件。[6]</p><p>  下圖是FileInfo圖4-2的類圖:</p><p>  圖4-2文件信息類圖</p><p>  創(chuàng)建下載任務(wù)

69、流程圖:</p><p>  圖4-3 創(chuàng)建下載任務(wù)流程</p><p><b>  4.4 任務(wù)下載</b></p><p>  任務(wù)下載模塊是本系統(tǒng)的核心,在任務(wù)運(yùn)行過(guò)程中主要的時(shí)間也是在花這一塊,它的設(shè)計(jì)質(zhì)量,會(huì)對(duì)軟件的效率,占用資源的大小,軟件的可靠性及可用性有很大的影響。就拿軟件的可用性來(lái)說(shuō),因?yàn)樵谙到y(tǒng)的下載過(guò)程中,讀取出來(lái)的長(zhǎng)度是隨

70、機(jī)的,而且還要關(guān)心著本線程的下載范圍,因此如果未對(duì)其中的各個(gè)細(xì)節(jié)進(jìn)行考慮,很容易就會(huì)出現(xiàn)讀臟數(shù)據(jù)的情況,導(dǎo)致最終下載過(guò)來(lái)的數(shù)據(jù)無(wú)法使用。</p><p>  4.4.1 功能說(shuō)明</p><p>  創(chuàng)建完任務(wù)就可以開始進(jìn)行下載操作了。在這個(gè)模塊中,要使用線程技術(shù)實(shí)現(xiàn)一個(gè)可重用的,較高效的實(shí)現(xiàn)程序。主要功能就是能讀取出指定資源相應(yīng)偏移量的數(shù)據(jù),并調(diào)用文件操作模塊將下載的數(shù)據(jù)保存到相應(yīng)文件中

71、去。</p><p>  4.4.2 設(shè)計(jì)說(shuō)明</p><p>  SpliteFileTask類圖:</p><p>  圖4-4-2 分任務(wù)類圖</p><p><b>  核心代碼:</b></p><p><b>  // 執(zhí)行分任務(wù)</b></p>&

72、lt;p>  public void run()</p><p><b>  {</b></p><p>  if (isOver)// 如果分任務(wù)下載已完成,則退出</p><p><b>  {</b></p><p>  isStop = true;</p><p&g

73、t;<b>  return;</b></p><p><b>  }</b></p><p>  InputStream input = connection();</p><p>  byte[] b = new byte[10240];</p><p><b>  int len;&

74、lt;/b></p><p><b>  try</b></p><p><b>  {</b></p><p>  dataFile = new RandomAccessFile(saveFileName, "rw");</p><p>  while ((len = i

75、nput.read(b, 0, b.length)) > 0 && !isOver && !isStop)</p><p><b>  {</b></p><p>  dataFile.seek(startPos);// 定位輸入點(diǎn)</p><p>  dataFile.write(b, 0, len);&

76、lt;/p><p>  startPos += len;</p><p>  if (startPos >= endPos)</p><p><b>  {</b></p><p>  isOver = true;</p><p>  isStop = true;</p><

77、p><b>  }</b></p><p><b>  }</b></p><p>  } catch (IOException e)</p><p><b>  {</b></p><p>  e.printStackTrace();</p><p&

78、gt;<b>  }</b></p><p><b>  }</b></p><p><b>  // 連接資源</b></p><p>  private InputStream connection()</p><p><b>  {</b></

79、p><p><b>  try</b></p><p><b>  {</b></p><p>  URL url = new URL(siteURL);</p><p>  HttpURLConnection httpConnection = (HttpURLConnection) url</p

80、><p>  .openConnection();</p><p>  httpConnection.setRequestProperty("User-Agent", "NetFox");</p><p>  String bytes = "bytes=" + startPos + "-";

81、</p><p>  httpConnection.setRequestProperty("RANGE", bytes);</p><p>  InputStream input = httpConnection.getInputStream();</p><p>  return input;</p><p>  } c

82、atch (MalformedURLException e)</p><p><b>  {</b></p><p>  e.printStackTrace();</p><p>  } catch (IOException e)</p><p><b>  {</b></p><

83、;p>  e.printStackTrace();</p><p><b>  }</b></p><p>  return null;</p><p><b>  }</b></p><p>  本設(shè)計(jì)中采用了線程池技術(shù)ExecutorService。</p><p>

84、;  public interface ExecutorServiceextends ExecutorExecutor提供了管理終止的方法,以及可為跟蹤一個(gè)或多個(gè)異步任務(wù)執(zhí)行狀況而生成Future的方法。 </p><p>  可以關(guān)閉 ExecutorService,這將導(dǎo)致其拒絕新任務(wù)。提供兩個(gè)方法來(lái)關(guān)閉 ExecutorService.shutdown()方法在終止前允許執(zhí)行以前提交的任務(wù),而shutdow

85、nNow()方法阻止等待任務(wù)啟動(dòng)并試圖停止當(dāng)前正在執(zhí)行的任務(wù)。在終止時(shí),執(zhí)行程序沒(méi)有任務(wù)在執(zhí)行,也沒(méi)有任務(wù)在等待執(zhí)行,并且無(wú)法提交新任務(wù)。應(yīng)該關(guān)閉未使用的ExecutorService以允許回收其資源。</p><p>  通過(guò)創(chuàng)建并返回一個(gè)可用于取消執(zhí)行和/或等待完成的Future,方法submit擴(kuò)展了基本方法Executor.execute(java.lang.Runnable)。方法invokeAny和i

86、nvokeAll是批量執(zhí)行的最常用形式,它們執(zhí)行任務(wù)collection,然后等待至少一個(gè),或全部任務(wù)完成(可使用ExecutorCompletionService類來(lái)編寫這些方法的自定義變體)。</p><p>  Executors類提供了用于此包中所提供的執(zhí)行程序服務(wù)的工廠方法。</p><p>  下面給出了一個(gè)網(wǎng)絡(luò)服務(wù)的簡(jiǎn)單結(jié)構(gòu),這里線程池中的線程作為傳入的請(qǐng)求。它使用了預(yù)先配置

87、的Executors.newFixedThreadPool(int)工廠方法: </p><p>  class NetworkService implements Runnable{</p><p>  private final ServerSocket serverSocket;</p><p>  private final ExecutorService

88、pool;</p><p>  public NetworkService(int port, int poolSize)</p><p>  throws IOException {</p><p>  serverSocket = new ServerSocket(port);</p><p>  pool = Executors.new

89、FixedThreadPool(poolSize);</p><p><b>  }[10]</b></p><p>  public void run() {</p><p><b>  try {</b></p><p>  for (;;) {</p><p>  po

90、ol.execute(new Handler(serverSocket.accept()));</p><p><b>  }</b></p><p>  } catch (IOException ex) {</p><p>  pool.shutdown();</p><p><b>  }</b>

91、;</p><p><b>  }</b></p><p><b>  }</b></p><p>  class Handler implements Runnable {</p><p>  private final Socket socket;</p><p>  H

92、andler(Socket socket) { this.socket = socket; }</p><p>  public void run() {</p><p><b>  }</b></p><p><b>  }</b></p><p>  下列方法分兩個(gè)階段關(guān)閉ExecutorSer

93、vice。第一階段調(diào)用shutdown拒絕傳入任務(wù),然后調(diào)用shutdownNow(如有必要)取消所有遺留的任務(wù):</p><p>  void shutdownAndAwaitTermination(ExecutorService pool) {</p><p>  pool.shutdown();</p><p><b>  try {</b&g

94、t;</p><p>  if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {</p><p>  pool.shutdownNow(); // Cancel currently executing tasks</p><p>  if (!pool.awaitTermination(60, TimeUnit.SEC

95、ONDS))</p><p>  System.err.println("Pool did not terminate");</p><p><b>  }</b></p><p>  } catch (InterruptedException ie) {</p><p>  pool.shutdow

96、nNow();</p><p>  Thread.currentThread().interrupt();</p><p><b>  }</b></p><p><b>  }</b></p><p>  內(nèi)存一致性效果:線程中向ExecutorService提交Runnable或Callable

97、任務(wù)之前的操作happen-before由該任務(wù)所提取的所有操作,后者依次happen-before通過(guò)Future.get()獲取的結(jié)果。[10]</p><p>  4.4.3 核心流程</p><p>  (1)子線程下載流程</p><p>  圖4-4 子線程下載流程圖</p><p><b>  (2)核心代碼</

98、b></p><p>  while((readBytes=is.read(buffer))!=-1&&!stop){</p><p>  size+=readBytes;//記錄已下載的字節(jié)數(shù)(未進(jìn)行無(wú)效數(shù)據(jù)刪減的)</p><p>  if(size>downFileLength){</p><p>  rea

99、dBytes=(int)(buffer.length-(size-downFileLength));</p><p>  flag=true;//設(shè)置下載范圍完成標(biāo)志</p><p>  //如果下載的長(zhǎng)度大于要下載的長(zhǎng)度減去多出來(lái)的部分,因?yàn)楫?dāng)前線程只要求下載固定長(zhǎng)度的文件</p><p><b>  }</b></p><

100、;p>  subThread.setDownedFileLength(subThread.getDownedFileLength()+readBytes);</p><p>  fo.saveFile(savePosition,buffer,saveFilePath,readBytes);</p><p>  //保存緩存的數(shù)據(jù)到文件中去</p><p>  

101、savePosition += readBytes;//設(shè)置保存偏移量</p><p>  task.setDownFileLength(task.getDownFileLength()+readBytes);</p><p>  //設(shè)置當(dāng)前任務(wù)的下載長(zhǎng)度,用于下載進(jìn)度和速度統(tǒng)計(jì)</p><p><b>  if(flag){</b><

102、/p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(!stop){</p><p>  subThread.setComplete(task,true);/

103、/設(shè)置線程下載完成,觸發(fā)下載完成事件</p><p><b>  }[7]</b></p><p>  4.5 事件監(jiān)聽器設(shè)計(jì)</p><p>  事件機(jī)制在這個(gè)設(shè)計(jì)中非常的重要,所有關(guān)于線程下載完成,任務(wù)下載完成的時(shí)候都是通過(guò)事件被觸發(fā)的方式完成。這種機(jī)制的好處就是不用開啟新的線程去監(jiān)視下載的情況,實(shí)時(shí)性上要比采用監(jiān)視線程要好很多,在消耗的資

104、源上也比開監(jiān)視線程要小很多,僅在事件被觸發(fā)時(shí)才進(jìn)行相應(yīng)的操作。</p><p>  4.5.1 功能說(shuō)明</p><p>  在任務(wù)下載過(guò)程中,要進(jìn)行一系列的操作如:下載文件的保存,根據(jù)下載線程的完成情況判斷文件是否下載完畢等,所以本系統(tǒng)中設(shè)計(jì)了一個(gè)監(jiān)聽器用來(lái)監(jiān)聽事件的變化。[8]在初始化任務(wù)和下載線程時(shí)為它們注冊(cè)監(jiān)聽器,并在事件處理代碼中對(duì)相應(yīng)的事件進(jìn)行響應(yīng)。事件處理機(jī)制在本設(shè)計(jì)中占有很

105、大的比重。</p><p>  4.5.2 設(shè)計(jì)說(shuō)明</p><p>  圖4-5 事件監(jiān)聽類圖</p><p>  通過(guò)方法重載給主界面MainFrame和給新建任務(wù)界面NewTask添加監(jiān)聽器:addToComponent()。</p><p>  此外監(jiān)聽類還實(shí)現(xiàn)了對(duì)下載的控制即暫停任務(wù),停止任務(wù),恢復(fù)任務(wù)同,移除已完成任務(wù)等操作。&l

106、t;/p><p>  取消任務(wù), 刪除table中的任務(wù):deleteTask()。</p><p>  關(guān)閉窗口的操作:exit()。</p><p>  讀取任務(wù)文件中的所有任務(wù) 并進(jìn)行初始化操作: init()。</p><p>  從第 row 行開始 刷新任務(wù)欄:initTable()。</p><p>  暫停

107、任務(wù):pause()。</p><p>  readTasks()和writeTasks()則分別從文件中讀取和保存文件信息。</p><p>  4.6 下載控制器設(shè)計(jì)</p><p>  本設(shè)計(jì)基本上符合MVC的設(shè)計(jì)模式,而作為C的部分,也是系統(tǒng)的核心部分。[9]系統(tǒng)中所有的命令都是通過(guò)下載控制器進(jìn)行轉(zhuǎn)發(fā),而GUI界面也就是通過(guò)下載控制器與網(wǎng)絡(luò),本地文件之間進(jìn)行

108、操作,從而實(shí)現(xiàn)系統(tǒng)的一個(gè)個(gè)功能。</p><p>  4.6.1 功能說(shuō)明</p><p>  下載控制器在本設(shè)計(jì)中處于核心的地位,所有來(lái)自GUI界面的請(qǐng)求,還有底層網(wǎng)絡(luò)操作及文件的操作都通過(guò)控制器進(jìn)行協(xié)調(diào)工作??刂破髟谡麄€(gè)系統(tǒng)的運(yùn)行周期中都存在著作用,在應(yīng)用程序剛剛啟動(dòng)時(shí),它需要讀取系統(tǒng)配置及上一次下載的斷點(diǎn)信息。所有對(duì)于下載的操作都要通過(guò)它來(lái)轉(zhuǎn)發(fā),甚至每一次斷點(diǎn)的保存都是通過(guò)它完成。&

109、lt;/p><p>  4.6.2 設(shè)計(jì)說(shuō)明</p><p>  控制器實(shí)現(xiàn)了Runnable[10]和Serializable接口,使得控制器類具備父類處理下載事件的能力。</p><p><b>  類圖4-6:</b></p><p>  圖4-6 控制器設(shè)計(jì)類圖</p><p><b&g

110、t;  成員變量說(shuō)明:</b></p><p>  fileinfo:用來(lái)保存當(dāng)前統(tǒng)中維護(hù)著的所有下載任務(wù)的信息,新建任務(wù)時(shí)就往當(dāng)中加入一個(gè)新的任務(wù)信息(NewTask),暫停任務(wù),停止任務(wù),恢復(fù)任務(wù)同,移除已完成等操作都要從fileinfo獲取信息或者寫入信息。</p><p>  fileLength:獲得文件的長(zhǎng)度</p><p>  startP

111、os:分任務(wù)開始位置</p><p>  endPos:分任務(wù)結(jié)束位置</p><p>  countThread:分任務(wù)的數(shù)目</p><p>  isFirst:是否第一次取文件</p><p>  isStop: 停止標(biāo)志</p><p>  tempFile:文件下載的臨時(shí)信息</p><p

112、>  executor:線程池</p><p>  private JTable viewTable = null;</p><p><b>  row:任務(wù)編號(hào)</b></p><p>  speed:任務(wù)下載的速度[11]</p><p><b>  核心代碼:</b></p>

113、<p>  public void run()</p><p><b>  {</b></p><p>  if (fileInfo.isOver())// 入文件已下載完畢,則結(jié)束任務(wù)返回</p><p><b>  return;</b></p><p><b>  el

114、se</b></p><p>  isStop = false;// 否則,將isStop 置為false</p><p>  tempFile = new File(fileInfo.getFilePath() + File.separator</p><p>  + fileInfo.getFileName() + ".info"

115、);</p><p>  countThread = fileInfo.getConutThread();// 分任務(wù)的數(shù)目</p><p>  if (tempFile.exists())</p><p>  {// 文件已存在,是續(xù)傳文件</p><p>  isFirst = false;</p><p>  S

116、ystem.out.println("文件已存在,是續(xù)傳文件" + tempFile);</p><p>  readFilePos();// 讀取保存的下載信息(文件指針位置)</p><p><b>  } else</b></p><p><b>  {</b></p><p&

117、gt;  startPos = new long[countThread];</p><p>  endPos = new long[countThread];</p><p>  splitTask = new SplitFileTask[countThread];</p><p>  fileLength = getFileLong();// 獲取文件的長(zhǎng)度&l

118、t;/p><p>  if (fileLength <= 0)</p><p><b>  {</b></p><p>  JOptionPane jp = new JOptionPane("網(wǎng)絡(luò)資源不正確!");</p><p>  jp.createDialog("提示信息"

119、);</p><p><b>  return;</b></p><p><b>  }</b></p><p>  fileInfo.setStartDate(Calendar.getInstance());// 設(shè)置任務(wù)開始時(shí)間</p><p>  fileInfo.setFileLength(

120、fileLength);// 設(shè)置文件的長(zhǎng)度</p><p><b>  }</b></p><p>  long tem = fileLength / countThread;// 每個(gè)分任務(wù)的長(zhǎng)度</p><p>  if (isFirst)</p><p><b>  {// 若是第一次</b>

121、;</p><p>  for (int i = 0; i < countThread; i++)</p><p><b>  {</b></p><p>  startPos[i] = i * tem; // 分任務(wù)開始位置</p><p><b>  }</b></p>&l

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論