【正文】
so far, nobody had thought of looking there for me. It was simply a matter of putting in half an hour or so. Normally the room was very convenient, though just at present its use required caution because the wattle wall between the rooms was cracked and I had to move very cautiously on tipt。s history that I would prefer not to have known. I was sitting quietly in the room next to my parents39。s bed. She looked so pink and wrinkled to me that I did not see how the inspector could have been quite sure about her. How ever, there was nothing obviously wrong with her, so she had got her certificate. Nobody could blame the inspector for that。 my father was perfectly well aware of that, too. At last Petra39。s room. Then followed the worst wait of all. Mary said afterwards that he hummed and ha39。 特此聲明! 作者簽名 : 2020 年 07 月 25 日 第 26 頁 共 25 頁 t was not until midafternoon that the inspector ambled up on his pony. My father pulled himself together, and went out to receive him。 ( 5)學(xué)??梢怨紝W(xué)位論文的全部或部分內(nèi)容(保密學(xué)位論文在解密后遵守此規(guī)定)。 ( 3)學(xué)??梢詫W(xué)術(shù)交流為目的復(fù)制、贈送和交換學(xué)位論文。 關(guān)于學(xué)位論 文使用權(quán)和研究成果知識產(chǎn)權(quán)的說明: 本人完全了解成都信息工程學(xué)院有關(guān)保管使用學(xué)位論文的規(guī)定,其中包括: ( 1)學(xué)校有權(quán)保管并向有關(guān)部門遞交學(xué)位論文的原件與復(fù)印件。文中除了特別加以標注地方外,不包含他人已經(jīng)發(fā)表或撰寫過的研究成果,也不包含為獲得成都信息工程學(xué)院或其他教學(xué)機構(gòu)的學(xué)位或證書而使用過的材料。 參考文獻 [1] 耿祥義,張躍平 .JAVA 2實用教程 (第二版 )[M].北京 :清華大學(xué)出版社 ,2020. [2] 霍爾澤 .Eclipse集成開發(fā)工具 [M].南京: 東南大學(xué)出版社, 2020. [3] 張桂元,賈燕楓 .Eclipse開發(fā)入門與項目實踐 [M].北京: 人民郵電出版社, 2020. [4] 葉達峰 .Eclipse編程技術(shù)與實例 [M].北京: 人民郵電出版社, 2020. [5] 陳剛 .Eclipse從入門到精通 [M].北京: 清華大學(xué)出版社, 2020. [6] Hughes, Shoffner, Hamner, Java網(wǎng)絡(luò)編 程 技術(shù)內(nèi)幕 [M].北京: 國防工業(yè)出版社, 2020. [7] Horstmann, I:基礎(chǔ)知識 [M].北京:機械工業(yè)出版社, 2020. [8] Bruce 編程 思想 [M].北京:機械工業(yè)出版社, 2020. [9] 劉亞賓,楊紅 .精通 Eclipse[M]. 北京 : 電子工業(yè)出版社, 2020. 第 24 頁 共 25 頁 致 謝 本文是在何林波老師的熱情關(guān)心和指導(dǎo)下完成的,他淵博的知識和嚴謹?shù)闹螌W(xué)作風(fēng)使我受益匪淺,對順利完成本課題起到了極大的作用。在這個過程中,我對面向?qū)ο蟪绦蛟O(shè)計、有了深刻的認識,對Java 語言和 SWT 技術(shù)有了進一步的掌握和了解,對系統(tǒng)的分析與設(shè)計過 程有了切身的認識和體會,并在學(xué)習(xí)和實踐過程中增長了知識、豐富了 編程 經(jīng)驗。 通過這次畢業(yè)設(shè)計,我基本達到了當(dāng)初設(shè)下的一些目標: 學(xué)習(xí)掌握了 JAVA中線程的生命周期及狀態(tài)遷移、掌握線程的調(diào)度策略、 第 23 頁 共 25 頁 線程優(yōu)先級和線程同步等基本知識; 了解了 協(xié)議的基本知識; 學(xué)習(xí)、研究了斷點續(xù)傳的基本原理; 設(shè)計、實現(xiàn)了一個下載工具,能在互聯(lián)網(wǎng)上分段下載軟件,并支持斷點續(xù)傳的特性。 通過 Apache Jakarta Commons 下的子項目 HttpClient 包對 Http 協(xié)議進行支持,從而下載服務(wù)器端的資源。 總體說來有以下一些成果:使用 Java 多線程技術(shù)編寫出了一個時下流行的基于 Http 協(xié)議的多線程斷點續(xù)傳程序。 ((), contentLength)。 (msg)。 try { contentLength = getResourceContentLen()。 (msg)。 public void addDownloadListener(DownloadListener listener) { = listener。 //添加監(jiān)聽 private static final Log logger = ()。 } })。 Display display = ().getShell().getDisplay()。 final String fileType = 。 final String timeRemain = milliSecondsToStr((contentLength pleted) / speed * 1000)。 final String percent = (pleted * 100 / contentLength)。 } //信息的更新 public synchronized void onReadChunk(String name, int size) { pleted += size。 (new Runnable() { public void run() { (new String[]{ fname, (contentLength), 0%, , , , })。 lastTimeDataReceived = ()。 }}} //在任務(wù)剛建立時信息的初始化 public void onGetContentLength(final String fname, long len) { = fname。amp。 int index = ()。 ().getShell().getDisplay().syncExec( new Runnable() { public void run() { Table tasksTable = ().getTasksTable()。 long seconds = milliSeconds / 1000 % 60。 long hours = (milliSeconds / 1000 % (24 * 60 * 60)) / (60 * 60)。} return speed / (1 20) + units[2]。 if (speed 1 10) { return speed + units[0]。 return speed。 long slice = now lastTimeDataReceived。這樣的話就有效地保證了這些線程的共享數(shù)據(jù)的一致性,從而也就保證了程序的正確性,保證了對共享數(shù)據(jù)操作的完整性,即 實現(xiàn) 了 不同線程對共享數(shù)據(jù)操作的同步 ,這是線程安全的 核心問題,在這里得到了很好的體現(xiàn)。監(jiān)控下載信息類圖如下: 圖 11 批量下載任務(wù)對話框 監(jiān)控下載信息順序圖 根據(jù)下載監(jiān)聽活動描述下載信息監(jiān)聽順序圖: 圖 12 監(jiān)聽下載信息順序圖 監(jiān)控下載信息實現(xiàn) 要實現(xiàn)對下載文件信息的 監(jiān)控需要先在 用戶界面中 添加監(jiān)聽機制 ,需要監(jiān)視 第 20 頁 共 25 頁 的內(nèi)容主要包括:下載文件的文件名、下載文件的大小、下載任務(wù)進行的進度(完成的百分比)、下載任務(wù)的即時速度、剩余時間、已用時間和文件類型。分別在命令行參數(shù)執(zhí)行和用戶圖形界面中分別繼承DownloadListener 的方法。新建批量任務(wù)流 程圖: 第 18 頁 共 25 頁 圖 9 批量下載任務(wù)流程圖 圖 10 批量下載任務(wù)對話框 監(jiān)控下載信息設(shè)計 監(jiān)控下載信息類圖 監(jiān)控下載信息主要是為用戶提供文件下載時的相應(yīng)返回信息,方便用戶使用時能夠清楚地知道下載文件當(dāng)前運行的狀況。軟件提供了批量下載就解決了重復(fù)工作的。批量下載針對的是一些下載資源分成很多部分或是類似下載連續(xù)劇 URL 地址一樣的,大部分的 URL 都是相同 的,只是在地址的某個序號不同。} catch(MalformedURLException e) { } return 。 try { url = new URL(textData)。 String textData = (String)(textTransfer)。主要代碼如下: protected String getClipBoardURL() { Clipboard clipboard = new Clipboard(())。為了用戶使用更加的方便,下載軟件在新建任務(wù)時支持將系統(tǒng)剪貼板中的內(nèi)容( URL 地址)自動添加到新建任務(wù)中的 URL 地址 欄中,這樣就意味著用戶在粘貼地址后再打開新建下載任務(wù)時, ULR 地址已經(jīng)被填在新建任務(wù)中的URL 地址欄。 第 17 頁 共 25 頁 store = new RandomAccessFile(destination, rw)。 startPos = endPos。} workers[i] = new HttpTaskWorker( Worker Thread + (i + 1), startPos, endPos 1)。 i++) {ndPos = startPos + chunk。 for (int i = 0。 long startPos = 0。 ((), contentLength)。 (msg)。 //將文件分塊 , 并建立相應(yīng)線程完成下載 contentLength = getResourceContentLen()。 head = new HeadMethod(())。 (URL redirection: + recentUrl)。 int statusCode = (head)。 第 16 頁 共 25 頁 //得到文件大小 HeadMethod head = new HeadMethod(())。 ().setDefaultMaxConnectionsPerHost(20)。 } 下載功能的實現(xiàn)主要原理是: ? 判斷 NewHttpTask 構(gòu)造函數(shù)中參數(shù)是否合法; ? 然后通過使用 HttpClient 包,建立 HTTP 連接; ? 通過 Head 方法得到相應(yīng)文件的長度信息; ? 判斷是否支持多線程下載; ? 通過 判斷狀態(tài)碼( Status Code)判斷是否有異常或者文件是全部下載還是部分下載,也就是文件是第一次下載還是有過停止后繼續(xù)下載。 return panel; } protected void createButtonsForButtonBar(Composite parent) { createButton(parent, , 確定 , true)。 new Label(panel,).setText(選擇下載線程數(shù) )。 (0)。 String dir = ()。 (請選擇一個目錄: )。 DirectoryDialog dlg = new DirectoryDialog(shell)。 (瀏覽 )。 (new GridLayout(5, false))。 GridData panelData = new GridData(, , true, true)。同 時在點擊瀏覽按鈕時會彈出瀏覽目錄對話框,如圖 8 所示: 圖 8 瀏覽對話框 以下是對話框的設(shè)計實現(xiàn)核心代碼: protected Control createDialogArea(Composite parent) { Composite posite = (Composite)(parent)。 下載任務(wù)具體實現(xiàn) 下載任務(wù)管理主要是對下載任務(wù)進行操作,下載任務(wù)中主要包括新建下載