網(wǎng)絡(luò)實時文件傳輸軟件的開發(fā)【畢業(yè)論文】_第1頁
已閱讀1頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  本科畢業(yè)設(shè)計</b></p><p><b> ?。?0 屆)</b></p><p>  網(wǎng)絡(luò)實時文件傳輸軟件的開發(fā)</p><p>  所在學(xué)院 </p><p>  專業(yè)班級 通信工程

2、 </p><p>  學(xué)生姓名 學(xué)號 </p><p>  指導(dǎo)教師 職稱 </p><p>  完成日期 年 月 </p><p><b>  摘 要</b><

3、;/p><p>  當前中國的互聯(lián)網(wǎng)技術(shù)已經(jīng)進入了一個飛速發(fā)展的時期,即時通訊工具作為當今網(wǎng)絡(luò)應(yīng)用的主流,越來越受到了人們的青睞,使人們的網(wǎng)上生活更加豐富多彩?,F(xiàn)在人們開發(fā)了越來越多的軟件使文件傳輸再也不用像以前那么麻煩,它既方便又快捷,能為人們省下很多寶貴的時間。本畢業(yè)設(shè)計就是開發(fā)了一個網(wǎng)絡(luò)實時文件傳輸?shù)能浖?lt;/p><p>  本設(shè)計的開發(fā)采用C/S結(jié)構(gòu),在基于C++ Builder開發(fā)

4、環(huán)境下,使用C++編程語言進行開發(fā)。本文首先論述了現(xiàn)今傳輸軟件的發(fā)展方向,并對開發(fā)環(huán)境和開發(fā)的主要內(nèi)容進行了簡單的介紹。本設(shè)計所開發(fā)的軟件是基于TCP/IP協(xié)議,論文中也介紹了TCP/IP協(xié)議和FTP的一些相關(guān)知識。本文還論述了線程的概念、優(yōu)缺點以及在C++ Builder中的實現(xiàn),重點介紹了軟件的開發(fā)思路和程序中關(guān)鍵代碼的解析。通過運行、測試與分析,該軟件運行穩(wěn)定、可靠,具有一定的實用價值。</p><p> 

5、 關(guān)鍵詞:C++ Builder;TCP/IP協(xié)議;實時文件傳輸</p><p><b>  Abstract</b></p><p>  Nowadays, China's Internet technology has already entered a rapid development times, instant messaging tools as

6、 the mainstream of network application, which causes people's online life to be more richly colorful, and has also received people's favors simultaneously. Now people developed more and more software makes file t

7、ransfers easier, it is so convenient and fast, help people save a lot of precious time. This graduation project is to develop a software of real time file transfer on network.</p><p>  The development of thi

8、s design useing C/S structure based on C++ Builder, by the use of C++ programming language development. This article first discusses the current direction of transmission of software development, and introduced the devel

9、opment environment and the primary contents of the development. This design software is based on TCP/IP protocol, and also introduces the TCP/IP protocol and some relevant knowledge of FTP. This article also discusses th

10、e concept of thread, the advantages an</p><p>  Key Words:C++ Builder;TCP/IP protocol;real-time file transfers</p><p><b>  目 錄</b></p><p><b>  1 概 述1</b>&

11、lt;/p><p>  1.1 課題研究背景及意義1</p><p>  1.2 研究工作和論文內(nèi)容1</p><p>  2 TCP/IP技術(shù)與FTP文件傳輸3</p><p>  2.1 TCP/IP特點3</p><p>  2.2 TCP/IP協(xié)議體系結(jié)構(gòu)3</p><p>  

12、2.3 TCP/IP傳輸文件機制5</p><p>  2.4 FTP文件傳輸知識5</p><p><b>  3 線程7</b></p><p>  3.1 線程的概念.7</p><p>  3.2 使用線程的優(yōu)缺點7</p><p>  3.3 線程在C++ Builder中的

13、實現(xiàn)7</p><p>  4 文件傳輸?shù)膶崿F(xiàn)10</p><p>  4.1 總體方案10</p><p>  4.2 C++ Builder開發(fā)環(huán)境10</p><p>  4.3 用于文件傳輸?shù)慕M件11</p><p>  4.4 文件傳輸協(xié)議12</p><p>  4.5

14、 文件傳輸軟件設(shè)計13</p><p>  4.5.1 設(shè)計思路13</p><p>  4.5.2 軟件界面框架構(gòu)建13</p><p>  4.5.3 關(guān)鍵代碼分析15</p><p>  5 軟件運行與結(jié)果20</p><p>  5.1 運行情況20</p><p>  5

15、.2 有待開發(fā)的地方23</p><p><b>  6 結(jié) 論24</b></p><p><b>  致 謝25</b></p><p><b>  參考文獻26</b></p><p>  附錄1 主要源程序代碼27</p><p>

16、;  附錄2 畢業(yè)設(shè)計作品說明書41</p><p><b>  1 概述</b></p><p>  1.1 課題研究背景及意義</p><p>  網(wǎng)絡(luò)是一個激動人心的領(lǐng)域,編寫網(wǎng)絡(luò)上的應(yīng)用程序更是很多程序員所向往的,然而編寫網(wǎng)絡(luò)程序需要掌握大量的網(wǎng)絡(luò)傳輸協(xié)議、編程接口和WinSock32 API函數(shù)。20世紀90年代以來,計算機網(wǎng)絡(luò)

17、技術(shù)和信息處理技術(shù)在全世界范圍得到了迅猛發(fā)展,基于TCP/IP協(xié)議的文件傳輸和即時聊天系統(tǒng)迅速成為數(shù)據(jù)通信網(wǎng)絡(luò)上最常用的的應(yīng)用。</p><p>  隨著Internet和局域網(wǎng)的飛速發(fā)展和普及,越來越多的企業(yè)、事業(yè)單位和學(xué)校都已經(jīng)建成局域網(wǎng)并接上了Internet。在局域網(wǎng)或Internet上很需要一些軟件能夠很方便快捷地實現(xiàn)互相發(fā)送信息和傳送文件等功能?,F(xiàn)在用戶可以通過QQ、MSN、郵箱、FTP等傳送文件,不

18、過對于需要傳送容量比較大的文件就有些費時。</p><p>  本課題所要完成的是用C++ Builder設(shè)計一個基于TCP/IP協(xié)議的點對點的文件發(fā)送和接收。和FTP相比,我所要設(shè)計的軟件不需要服務(wù)器,直接點對點傳輸,安全性高,如果加密的話就算文件在傳輸?shù)臅r候被截,別人也看不到正確的內(nèi)容,只有接受方解密后才能閱讀。該軟件既節(jié)省了網(wǎng)絡(luò)帶寬又提高了傳輸速度,給網(wǎng)絡(luò)用戶帶來了很大的方便。</p><

19、;p>  1.2 研究開發(fā)和論文內(nèi)容</p><p>  1、開發(fā)工作主要內(nèi)容</p><p>  利用C++ Builder設(shè)計一個軟件,能夠?qū)崿F(xiàn)文件實時點對點發(fā)送與接收。設(shè)計中進行建立Socket連接,首先需要設(shè)置IP地址然后打開服務(wù)器開始偵聽。當服務(wù)器與客戶端連接上之后才能發(fā)送文件,如果服務(wù)器未開始偵聽或者未連上服務(wù)器,則彈出提示框“網(wǎng)絡(luò)故障,請檢查服務(wù)器是否打開?”。當客戶端

20、與服務(wù)器成功連接后,可以由客戶端向服務(wù)器發(fā)送文件,也可以由服務(wù)器向客戶端發(fā)送文件,然后點擊文件發(fā)送的按鈕,就能成功的接收到文件,并彈出一個提示框提示用戶表明文件發(fā)送成功,然后還能在顯示文本處顯示出文件發(fā)送過程中一系列的內(nèi)容。</p><p>  為實現(xiàn)以上內(nèi)容,主要需要對TCP/IP協(xié)議、C++ Builder開發(fā)平臺、界面開發(fā)以及Socket編程進行研究。</p><p><b&g

21、t;  2、論文內(nèi)容</b></p><p>  論文分成六章來介紹在C++ Builder平臺下網(wǎng)絡(luò)實時文件傳輸軟件的開發(fā),從開發(fā)所需要的相關(guān)知識到開發(fā)的方案以及開發(fā)過程都有所涉及。第一章概述介紹了本課題的背景、意義和研究開發(fā)的主要內(nèi)容。第二章介紹了TCP/IP技術(shù)與FTP文件傳輸,主要介紹了TCP/IP協(xié)議的相關(guān)知識和FTP相關(guān)知識。第三章為線程,介紹了線程的概念、使用線程的優(yōu)缺點和在C++ Bu

22、ilder中的實現(xiàn)。第四章是總體的方案和C++ Builder開發(fā)平臺,重點介紹了軟件開發(fā)的思路以及程序中關(guān)鍵代碼的解析。第五章給出了軟件的運行結(jié)果,同時講述了本次設(shè)計的不足的地方。最后一章為結(jié)論部分,對整個論文工作情況進行總結(jié)。</p><p>  2 TCP/IP技術(shù)與FTP文件傳輸</p><p>  2.1 TCP/IP特點</p><p>  傳輸層協(xié)議

23、(TCP、UDP),網(wǎng)絡(luò)層協(xié)議(IP)和物理接口層是TCP/IP協(xié)議的核心部分,這三層通常是在操作系統(tǒng)內(nèi)核中實現(xiàn)。編程時,編程界面有兩種形式:(1) 是由內(nèi)核心直接提供的系統(tǒng)調(diào)用;(2) 使用以庫函數(shù)方式提供的各種函數(shù)。前者為核內(nèi)實現(xiàn),后者為核外實現(xiàn)。用戶服務(wù)要通過核外的應(yīng)用程序才能實現(xiàn),所以要使用套接字(Socket)來實現(xiàn)[1]。</p><p>  2.2 TCP/IP協(xié)議體系結(jié)構(gòu)</p>&

24、lt;p>  TCP/IP協(xié)議源于1969年,是針對Internet開發(fā)的一種體系結(jié)構(gòu)和協(xié)議標準,目的在于解決異種計算機網(wǎng)絡(luò)的通信問題。使得網(wǎng)絡(luò)在互聯(lián)時能為用戶提供一種通用、一致的通信服務(wù)[2]。</p><p>  TCP/IP協(xié)議實際上就是在物理網(wǎng)上的一組完整的網(wǎng)絡(luò)協(xié)議。其中TCP是提供傳輸層服務(wù),而IP則是提供網(wǎng)絡(luò)層服務(wù)。TCP/IP包括以下協(xié)議,其結(jié)構(gòu)如圖2-1所示。</p><

25、p>  IP:網(wǎng)間協(xié)議(Internet Protocol),主要負責主機間數(shù)據(jù)的路由和網(wǎng)絡(luò)上數(shù)據(jù)的存儲。同時為ICMP、TCP、UDP提供分組發(fā)送服務(wù)。用戶進程通常不需要涉及這一層。</p><p>  RARP:反向地址解析協(xié)議(Reverse Address Resolution Protocol),此協(xié)議將硬件地址映射到網(wǎng)絡(luò)地址。</p><p>  ARP:地址解析協(xié)議(A

26、ddress Resolution Protocol),此協(xié)議將網(wǎng)絡(luò)地址映射到硬件地址。</p><p>  ICMP:網(wǎng)間報文控制協(xié)議(Internet Control Message Protocol),此協(xié)議處理信關(guān)和主機的差錯和傳送控制。</p><p>  UDP:用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol),這是提供給用戶進程的無連接協(xié)議,用于傳送數(shù)據(jù)而不執(zhí)行

27、正確性檢查。</p><p>  TCP:傳送控制協(xié)議(Transmission Control Protocol),這是一種提供給用戶進程的可靠的全雙工字節(jié)流面向連接的協(xié)議。它要為用戶進程提供虛電路服務(wù),并為數(shù)據(jù)可靠傳輸建立檢查。(注:大多數(shù)網(wǎng)絡(luò)用戶程序使用TCP)</p><p>  SMTP:簡單郵件傳送協(xié)議(Simple Mail Transfer Protocol),SMTP協(xié)議

28、為系統(tǒng)之間傳送電子郵件。</p><p>  TELNET:終端協(xié)議(Telnet Terminal Procotol),允許用戶以虛終端方式訪問遠程主機。</p><p>  FTP:文件傳輸協(xié)議(File Transfer Protocol),允許用戶以文件操作的方式(文件的增、刪、改、查、傳送等)與另一主機相互通信。</p><p>  HTTP:超文本傳輸協(xié)

29、議(Hypertext Transfer Procotol)</p><p>  TFTP:簡單文件傳輸協(xié)議(Trivial File Transfer Protocol)</p><p>  IP協(xié)議在每個包頭上加上接收端主機地址,這樣方便數(shù)據(jù)找到自己要去的地方,如果在傳輸過程中出現(xiàn)數(shù)據(jù)丟失、失真等情況,TCP協(xié)議會自動要求數(shù)據(jù)重傳[3]。</p><p>  T

30、CP/IP協(xié)議的基本傳輸單位是數(shù)據(jù)包(Datagram),TCP協(xié)議負責把數(shù)據(jù)分成若干個數(shù)據(jù)包,然后給每個數(shù)據(jù)包加上包頭,包頭上有相應(yīng)的編號,用以保證在數(shù)據(jù)接收端能將數(shù)據(jù)還原為原來的格式[4]。</p><p>  2.3 TCP/IP傳送文件機制</p><p>  物理層通過MAC地址向鏈路層傳送數(shù)據(jù)幀;鏈路層使用TYPE或DASP(Destination Service Access

31、 Point)識別IP協(xié)議;網(wǎng)絡(luò)層根據(jù)協(xié)議號識別TCP或UDP;傳輸層經(jīng)端口號訪問各種應(yīng)用服務(wù)[5],如圖2-2所示。</p><p>  2.4 FTP文件傳送知識</p><p>  FTP協(xié)議(File Transfer Protocol)是互聯(lián)網(wǎng)的主要傳輸機制,它能夠?qū)崿F(xiàn)在不同的計算機、不同的操作系統(tǒng)、不同的網(wǎng)絡(luò)之間進行文件傳輸。從根本上說,F(xiàn)TP就是在網(wǎng)絡(luò)中各種不同的計算機之間按

32、照TCP/IP協(xié)議來傳輸文件。FTP的主要作用就是讓用戶連接上一個遠程計算機(這些計算機上運行著FTP服務(wù)器程序)察看遠程計算機有哪些文件,然后把本地計算機的文件送到遠程計算機上去,或把文件從遠程計算機上拷到本地計算機。</p><p>  FTP采用的也是現(xiàn)在流行的C/S(客戶機/服務(wù)器)模式,由FTP客戶端程序和FTP服務(wù)器端程序組成。通常服務(wù)器是遠程站點,用戶可以通過Internet網(wǎng)絡(luò)連接到遠程的FTP服

33、務(wù)器站點。當然并非所有的站點用戶都有權(quán)限訪問,有些服務(wù)器需要用戶有一定的訪問權(quán)限。FTP站點可以是公共的,任何能連接上Internet的人都能夠訪問;也可以是私有的,當然這個時候就必須具備一定的權(quán)限,比如有相應(yīng)的用戶名和密碼;或者是兩種性質(zhì)都有,這時可能能訪問和操作其中的一部分內(nèi)容[6]。</p><p>  用戶通過客戶機程序向服務(wù)器程序發(fā)出命令,服務(wù)器程序執(zhí)行用戶所發(fā)出的命令,并將執(zhí)行的結(jié)果返回到客戶機。以下

34、載文件為例,當你啟動FTP從遠程計算機拷貝文件時實際上啟動了兩個程序:一個本地機上的FTP客戶程序,它向FTP服務(wù)器提出拷貝文件的請求。另一個是啟動在遠程計算機的上的FTP服務(wù)器程序,它響應(yīng)你的請求把你指定的文件傳送到你的計算機中。</p><p>  使用FTP時必須先登錄,在遠程主機上獲得相應(yīng)的權(quán)限以后,方可下載或上傳文件。FTP服務(wù)器可以進行各種設(shè)置,比如有些目錄讀寫刪除屬性等。像現(xiàn)在許多公共的FTP站點都

35、會有幾種權(quán)限的目錄,一種是讓用戶下載,除此之外,用戶不能進行其他的操作,如“/public”等;而有些是讓用戶上傳或者刪除的,如“/incoming”等。對于一些公共的FTP站點,不管在服務(wù)器端有沒有賬號都能夠下載文件,這就被稱為“匿名(Anonymous)FTP”。當連接到一個匿名服務(wù)器的時候,通常指定“anonymous”作為用戶名,以“guest”或者電子郵件作為密碼[6]。</p><p>  當遠程主機

36、提供匿名FTP服務(wù)時,作為一種安全措施,大多數(shù)匿名FTP主機都允許用戶從其下載文件,而不允許用戶向其上傳文件,即使有些匿名FTP主機確實允許用戶上傳文件,用戶也只能將文件上傳至某一指定上傳目錄中。隨后,系統(tǒng)管理員會去檢查這些文件,他會將這些文件移至另一個公共下載目錄中,供其他用戶下載,利用這種方式,遠程主機的用戶得到了保護,避免了有人上傳有問題的文件,如帶病毒的文件[7]。</p><p><b>  

37、3 線程</b></p><p><b>  3.1 線程的概念</b></p><p>  線程是計算機中獨立運行的最小單位,運行時占用很少的系統(tǒng)資源。由于每個線程占用的CPU時間是由系統(tǒng)分配的,因此可以把線程看成操作系統(tǒng)分配CPU時間的基本單位。在用戶看來,多個線程是同時執(zhí)行的,但從操作系統(tǒng)調(diào)度上看,各個線程是交替執(zhí)行的。系統(tǒng)不停地在各個線程之間切換

38、,每個線程只有在系統(tǒng)分配給它的時間片內(nèi)才能取得CPU的控制權(quán),執(zhí)行線程中的代碼[6]。在系統(tǒng)中,正確使用線程能夠很好的提高應(yīng)用程序的性能及運行效率,實現(xiàn)原理是將一個進程分成多個線程,然后讓它們并發(fā)異步執(zhí)行,來提高效率。</p><p>  3.2 使用線程的優(yōu)缺點</p><p>  使用線程的缺點:(1) 跟蹤大量的線程將占用大量的處理器的時間。如果線程過多,則其中大多數(shù)線程都不會產(chǎn)生明

39、顯的進度。如果大多數(shù)當前線程處于一個進程中,則其他進程中的線程的調(diào)度頻率就會很低;(2) 使用許多線程控制代碼執(zhí)行非常復(fù)雜,并可能產(chǎn)生許多錯誤;(3) 銷毀線程需要了解可能發(fā)生的問題并對那些問題進行處理。</p><p>  引入線程的好處:(1) 創(chuàng)建一個新線程花費的時間少;(2) 兩個線程的切換時間少;(3) 由于同一個進程內(nèi)的線程共享內(nèi)存和文件,所以線程之間互相通信必須調(diào)用內(nèi)核;(4) 線程能獨立執(zhí)行,能充

40、分利用和發(fā)揮處理機與外圍設(shè)備并行工作的能力。</p><p>  3.3 線程在C++ Builder中的實現(xiàn)</p><p>  一個應(yīng)用程序,在需要的時候可以有許多個執(zhí)行線程,每個線程就是一個小的執(zhí)行程序,操作系統(tǒng)自動使各個線程共享CPU資源,確保任一線程都不能使系統(tǒng)死鎖。這樣,在編程的時候,可以把費時間的任務(wù)移到后臺,在前臺用另一個線程接受用戶的輸入。對那些對實時性要求比較高的編程任

41、務(wù),如網(wǎng)絡(luò)客戶服務(wù)、串行通信等應(yīng)用時,多線程的實現(xiàn)無疑大大地增強了程序的可用性和穩(wěn)固性。</p><p>  線程同進程一樣是實現(xiàn)Windows系統(tǒng)多任務(wù)的一種重要機制,提供了進行多任務(wù)處理的能力。任何一個進程在被創(chuàng)建后都必須同時啟動一個主線程,也就是說一個進程至少要擁有一個線程。線程只能存在于某個進程環(huán)境中,其生命周期也被限制在其內(nèi),一旦進程終止,它所包含的全部線程也將同時被撤銷[8]。使用線程所帶來的最大優(yōu)勢

42、是可以充分利用CPU資源并大幅度提升程序的并行處理能力。</p><p><b>  1、創(chuàng)建多線程程序</b></p><p>  首先,先介紹一下實現(xiàn)多線程的具體步驟。在C++ Builder中雖然用Tthread對象說明了線程的概念,但是Tthread對象本身并不完整,需要在TThread下新建其子類,并重載Execute方法來使用線程對象。</p>

43、<p>  在C++ Builder IDE環(huán)境下選擇菜單File|New,在New欄中選中Thread Object,按OK,接下來彈出輸入框,輸入TThread對象子類的名字MyThread,這樣C++ Builder自動為你創(chuàng)建了一個名為TMyThread的TThread子類。同時編輯器中多了一個名為Unit2.cpp的單元,如下就是我們創(chuàng)建的TMyThread子類的原代碼:</p><p>

44、  #pragma hdrstop</p><p>  #include "Unit2.h"</p><p>  #pragma package(smart_init)</p><p>  //-------------------------------------------------------------------------<

45、/p><p>  // Important: Methods and properties of objects in VCL can only be</p><p>  // used in a method called using Synchronize, for example:</p><p>  // Synchronize(UpdateC

46、aption);</p><p>  // where UpdateCaption could look like:</p><p>  // void __fastcall MyThread::UpdateCaption()</p><p><b>  // {</b></p><p>  //

47、 Form1->Caption = "Updated in a thread";</p><p><b>  // }</b></p><p>  //-------------------------------------------------------------------------</p>

48、<p>  __fastcall MyThread:: MyThread(bool CreateSuspended)</p><p>  : TThread(CreateSuspended)</p><p><b>  {</b></p><p><b>  }</b></p><p>

49、  //-------------------------------------------------------------------------</p><p>  void __fastcall MyThread::Execute()</p><p><b>  {</b></p><p>  //---- Place thread

50、 code here ----</p><p><b>  }</b></p><p>  //-------------------------------------------------------------------------</p><p>  其中的Execute()函數(shù)就是我們要在線程中實現(xiàn)的任務(wù)的代碼所在處。在原代碼中包

51、含Unit2.cpp,這個由我們創(chuàng)建的TMyThread對象就可以使用了。</p><p>  以上初步地實現(xiàn)了在程序中創(chuàng)建一個自定義的線程,并使程序?qū)崿F(xiàn)了多線程應(yīng)用。但是,多線程應(yīng)用的實現(xiàn),并不是一件簡單的工作,還需要考慮很多使多個線程能在系統(tǒng)中共存、互不影響的因素。比如,程序中公共變量的訪問、資源的分配,如果處理不當,不僅線程會死鎖陷入混亂,甚至可能會造成系統(tǒng)崩潰??偟膩碇v,在多線程編程中要注意共享對象和數(shù)據(jù)

52、的處理,不能忽視。</p><p>  2、線程同步的三種實現(xiàn)方法</p><p>  (1) 利用互斥對象實現(xiàn);互斥對象(mutex)屬于內(nèi)核對象,它能夠確保線程擁有對單個資源的互斥訪問權(quán)?;コ鈱ο蟀粋€使用數(shù)量,一個線程ID和一個計數(shù)器。(2) 利用事件對象實現(xiàn);事件對象也屬于內(nèi)核對象,它包含三個成員:使用計數(shù)、指明該事件是自動重置事件還是人工重置事件的標志位、指明該事件處于已通知狀

53、態(tài)還是未通知狀態(tài)的標志位。(3) 利用關(guān)鍵代碼段實現(xiàn);關(guān)鍵代碼段也稱為臨界區(qū),工作在用戶方式下。它是指一小段代碼段,在代碼能夠執(zhí)行前,它必須獨占對某些資源的訪問權(quán)[9]。</p><p>  多線程是為了使得多個線程并行的工作以完成多項任務(wù),以提高系統(tǒng)的效率。線程是在同一時間需要完成多項任務(wù)的時候被實現(xiàn)的。</p><p>  4 文件傳輸?shù)膶崿F(xiàn)</p><p>

54、<b>  4.1 總體方案</b></p><p>  本次課題的目標是設(shè)計一個網(wǎng)絡(luò)實時文件傳輸?shù)能浖?。編程中需要建立一個客戶端和一個服務(wù)器端,兩者可以互傳文件。首先,在客戶端和服務(wù)器端各創(chuàng)建一個主線程mySndFileThread和一個文件發(fā)送線程TSndFileThread,在程序執(zhí)行時由主線程調(diào)用文件發(fā)送線程。打開一個文件,先計算出發(fā)送的文件長度,然后顯示出文件打開的路徑。發(fā)送端將要

55、傳送的文件分成指定大小的N個包,在每個包前加個包頭,因為服務(wù)器需要通過包頭知道傳送過來的是數(shù)據(jù)還是路徑(因為客戶端指定存放路徑),接收端收到數(shù)據(jù)后必須返回確認到發(fā)送端,這樣才能循環(huán)發(fā)送,但一定要有最后的終止,不然會死循環(huán)[10]。然后定義文件包的傳輸長度byte bTmpDataBuf[4096];每次傳送文件的長度為4096,最后一個包可能會小于4096,接收端對應(yīng)于顯示首次接收字節(jié)數(shù)、包頭、名稱、本次接收文件的長度等。最后文件發(fā)送成

56、功則彈出一個提示框顯示接收到的字節(jié)和保存路徑。相應(yīng)地,基于Socket編程的可靠性,服務(wù)器也能向客戶端發(fā)送文件。</p><p>  與FTP相比,本軟件不需要服務(wù)器,直接點對點傳輸,而且安全性比較高,如果加密的話就算被截,別人也看不到正確的內(nèi)容,只有接收方解密后才能閱讀。</p><p>  4.2 C++ Builder開發(fā)環(huán)境</p><p>  本畢業(yè)設(shè)計的

57、軟件開發(fā)使用到C++編程語言,借助C++ Builder6開發(fā)工具來實現(xiàn),操作系統(tǒng)是Microsoft Windows XP。</p><p>  Borland C++ Builder是Borland公司推出的全新32位Windows開發(fā)工具。C++ Builder不僅繼承了Delphi使用簡便,功能強大,效率高等特點,而且它還結(jié)合C++語言所有優(yōu)點。C++ Builder可以說是至今最好的Windows開發(fā)工

58、具。C++ Builder6是一款快速開發(fā)Win32應(yīng)用程序的可視化開發(fā)工具,利用它可以實現(xiàn)高性能執(zhí)行效率和出色的底層控制[11]。C++ Builder6相比于以前的版本,提供了更多的網(wǎng)絡(luò)開發(fā)組件,更快速方便的可視化環(huán)境。</p><p>  C++ Builder6集成開發(fā)環(huán)境包含可視化窗體設(shè)計器,對象觀察器、組件面板、工程管理器、源代碼編輯器、調(diào)試程序以及安裝工具等。在該窗體設(shè)計器中,你可以自由地移動可視化

59、表示的對象,同時在對象觀察器中編輯該對象的初始化運行時狀態(tài),在源代碼編輯器中編輯該對象執(zhí)行的邏輯。改變對象與代碼有關(guān)聯(lián)的屬性,比如改變事件句柄的名字時,對象觀察器會自動地改變相應(yīng)的源代碼。另外,在源代碼編輯器中更改該對象的源代碼,比如在窗體類聲明中改變事件句柄的名字時,對象觀察器也會立即反映出相應(yīng)的變化[12]。圖4-1是C++ Builder6的設(shè)計界面。</p><p>  圖4-1 C++ Builder

60、6設(shè)計界面</p><p>  4.3 用于文件傳輸?shù)慕M件</p><p>  本次設(shè)計分為客戶端和服務(wù)器兩個部分。</p><p>  1、客戶端用到的組件</p><p>  建立兩個窗體Form,把Form1和Form3的Caption分別改為現(xiàn)場文件服務(wù)系統(tǒng)和IP設(shè)置。向窗體Form1中添加的控件有:一個Memo控件、兩個Button

61、控件、一個ClientSocket控件、一個OpenDialog控件、一個PopupMenu控件和一個StausBar控件。向窗體Form3添加的控件有:兩個Button控件、一個Label控件和一個Edit控件。</p><p>  2、服務(wù)器端用到的組件</p><p>  建立一個窗體Form1,將其Caption改為中心文件服務(wù)系統(tǒng)。向窗體Form1中添加的控件有:一個Memo控件

62、、兩個Button控件、一個ServerSocket控件、一個OpenDialog控件和一個StausBar控件。</p><p>  4.4 文件傳輸協(xié)議</p><p>  通信協(xié)議是指通信雙方的一種約定。約定包括對數(shù)據(jù)格式、同步方式、傳送速度、傳送步驟、檢糾錯方式以及控制字符定義等問題做出統(tǒng)一規(guī)定,通信雙方必須共同遵守[13]。</p><p>  在編程中如

63、何實現(xiàn)文件的數(shù)據(jù)傳輸呢?把文件分成兩個部分,頭文件包括文件大小、文件名、文件名長度,后一部分為文件的內(nèi)容,程序中先發(fā)送頭文件。然后把文件拆分成N個包,每個包數(shù)據(jù)為4096字節(jié)[14]。在內(nèi)存中數(shù)據(jù)是用十六進制保存的,也就是說一字節(jié)數(shù)據(jù)可表示的范圍是00~FF,它的十進制表示是0~255。</p><p>  程序中用iSndFileLength=FileSeek(iSndFileHandle,0,2);獲取文件的

64、長度,F(xiàn)ileHandle是文件句柄。句柄實際就是結(jié)構(gòu)體指針,但系統(tǒng)不允許你直接訪問該結(jié)構(gòu)體成員,所以稱其為“句柄”,只應(yīng)該用專門的處理函數(shù)取操作該句柄,而不是應(yīng)該直接訪問結(jié)構(gòu)體成員。舉個例子:如果你想讀一個文件的內(nèi)容,首先通過一個findfile(“文件名”)的函數(shù)找到那個文件,這個函數(shù)就給你一個關(guān)于這個文件名的句柄,就是相當于使用權(quán)限,你以后讀、寫或刪除這個文件的時候都要告訴系統(tǒng),你有這個權(quán)限操作這個文件。FileSeek()函數(shù)中

65、0=文件頭,2=文件尾。計算出文件的總長度,然后按照每個包4096字節(jié)發(fā)送,每發(fā)完一次文件指針就會指向下一個包要發(fā)送的文件頭依次類推,最后一個包可能會小于4096。</p><p>  圖4-2 文件傳輸協(xié)議</p><p>  如圖4-2,前面四個FF表示存放頭文件的大小、文件名、文件名長度等字節(jié)數(shù),F(xiàn)F實際表示是兩位的16進制最大值。假如前四個大小依次為20,20,10,50,其長度

66、為20+20*256+10*256*256+50*256*256*256,其后的文件內(nèi)容字節(jié)數(shù)依次類推。在接收端也對應(yīng)于發(fā)送端,每次發(fā)送多少字節(jié)就接收多少字節(jié)。</p><p>  4.5 文件傳輸軟件設(shè)計</p><p>  4.5.1 設(shè)計思路</p><p>  本次設(shè)計是網(wǎng)絡(luò)實時文件傳輸軟件的開發(fā),程序的設(shè)計思路大致如下:先建立客戶端和服務(wù)器端,打開服務(wù)器開

67、始偵聽,雙擊窗體Form1中的Button1控件,在彈出的代碼窗口中的Button1Click()事件中添加代碼。然后在客戶端設(shè)置好IP后與服務(wù)器連接??蛻舳撕头?wù)器的StatusBar->Panels->Items[0]的文本顯示為“本地IP地址:...”,Items[1]提示為“尚未連接”。連接上服務(wù)器后Items[1]提示為“已經(jīng)被......連接上”。單擊發(fā)送文件按鈕打開選擇一個文件由客戶端向服務(wù)器發(fā)送文件,服務(wù)器能

68、接收到文件,彈出一個提示框表明文件發(fā)送完成。在服務(wù)器的Memo1中會顯示發(fā)送文件的長度、文件名、文件打開路徑、本次接收字節(jié)、保存路徑等內(nèi)容。也可以由服務(wù)器向客戶端發(fā)送文件,操作步驟與客戶端發(fā)送文件一致。當發(fā)送完成不需要發(fā)送文件時,再在服務(wù)器的Button1Click()事件中添加代碼ServerSocket1->Socket->Close();關(guān)閉服務(wù)器斷開連接,也可以關(guān)閉客戶端斷開連接。</p><p&

69、gt;  4.5.2 軟件界面框架構(gòu)建</p><p><b>  1、客戶端界面</b></p><p>  運行C++ Builder6,創(chuàng)建一個窗體Form3將其Caption改為“IP設(shè)置”。所需的控件:兩個Button控件、一個Label控件和一個Edit控件。將Label控件的Caption設(shè)置為“輸入中心IP地址:”。Edit控件可以顯示少量文本信息,設(shè)

70、置其Text為一個IP地址,如61.153.150.57。然后分別設(shè)置Button1和Button2控件的Caption為“確定”和“取消”。</p><p>  創(chuàng)建一個窗體Form1將其Caption設(shè)置為“現(xiàn)場文件服務(wù)系統(tǒng)”。所需的控件:一個Memo控件、兩個Button控件、一個ClientSocket控件、一個OpenDialog控件、一個PopupMenu控件和一個StausBar控件。Memo1控件

71、是用來顯示文本的,文件傳輸過程的內(nèi)容將顯示在其中。選中它之后,在對象檢視器里設(shè)置它的屬性。這里需要修改的屬性是ScrollBars,把ScrollBars屬性項設(shè)置成ssVertical,使Memo1在顯示文本的時候有垂直滾動條。StausBar控件用以顯示程序的運行狀況,單擊Panels屬性項右端的“…”按鈕,在彈出的對話框中添加兩個TStatusPanels,Items[0]的Text設(shè)置為“本地IP地址:”,Items[1]的Te

72、xt設(shè)置為“尚未連接”。然后分別設(shè)置Button1和Button2控件的Caption為“向中心發(fā)送文件”和“連接中心”。Button2控件其實就是單擊響應(yīng)事件,在這個程序里單擊它就能與服務(wù)器相連接。而OpenDialog1的作用是打開一個對話框,它被放在Button1單擊響應(yīng)事件中,用來在單擊事件發(fā)生后顯</p><p>  圖4-3 客戶端軟件界面</p><p><b>

73、  2、服務(wù)器端界面</b></p><p>  運行C++ Builder6,創(chuàng)建一個窗體Form1將其Caption改為中心文件服務(wù)系統(tǒng)。所需的控件是:一個Memo控件、兩個Button控件、一個ServerSocket控件、一個OpenDialog控件和一個StausBar控件。分別設(shè)置Button1和Button3控件的Caption為“等待連接”和“向現(xiàn)場發(fā)送文件”。其他控件設(shè)置與客戶端一致

74、,最后程序界面如圖4-4所示。</p><p>  圖4-4 服務(wù)器端軟件界面</p><p>  4.5.3 關(guān)鍵代碼分析</p><p>  先在服務(wù)器端打開偵聽,單擊ServerSocket1,在Events的OnListen處雙擊,代碼窗口中會自動生成一個該控件的基本程序框架。</p><p>  void __fastcall T

75、Form1::ServerSocket1Listen(TObject *Sender,</p><p>  TCustomWinSocket *Socket){ }</p><p>  通過在大括號內(nèi)編寫程序來實現(xiàn)偵聽功能,代碼如下:</p><p>  Memo1->Lines->Append("中心開始偵聽...");</p

76、><p>  在客戶端設(shè)置IP,當客戶端與服務(wù)器成功連接上之后,雙方就可以開始互相傳輸文件了。文件傳輸原理相同,這里介紹由客戶端向服務(wù)器傳輸文件。</p><p><b>  1、文件發(fā)送</b></p><p>  雙擊Button1控件,這里需要生成一個文件發(fā)送的線程TSndFileThread,由主線程mySndFileThread調(diào)用Tsn

77、dFileThread,代碼如下:</p><p>  mySndFileThread=new TSndFileThread(true);</p><p>  mySndFileThread->FreeOnTerminate=true;</p><p>  mySndFileThread->Resume();</p><p>  

78、創(chuàng)建一個文件發(fā)送線程,void __fastcall TSndFileThread::Execute(){ }</p><p>  在程序的開頭段定義一些全局變量:</p><p>  unsigned int iSndFileHandle;</p><p>  AnsiString sndFileName;</p><p>  AnsiSt

79、ring sndFileName0;</p><p>  unsigned int iSndFileLength;</p><p>  首先,打開文件需要一個對話框,才能選定要發(fā)送的文件。這里用到OpenDialog1控件,代碼如下:</p><p>  if (Form1->OpenDialog1->Execute()){ }</p>

80、<p>  也就是說如果OpenDialog1存在的話,那么接著執(zhí)行下面的工作,在大括號里添加代碼如下:</p><p>  Form1->Memo1->Lines->Append("\n\n=========================\n");</p><p>  sndFileName=Form1->OpenDialog1-&

81、gt;FileName;</p><p>  文件打開成功后,先獲得其總長度并添加到Memo1中,代碼如下:</p><p>  iSndFileLength = FileSeek(iSndFileHandle,0,2); //獲得文件長度</p><p>  Form1->Memo1->Lines->Append("發(fā)送的文件

82、長度為:"+AnsiString (iSndFileLength));</p><p>  定義發(fā)送文件名的長度byte fileNameLen;用函數(shù)Length()計算出其長度,接著定義一個數(shù)組計算文件內(nèi)容的長度,代碼如下:</p><p>  byte *sendHeadBuf=new byte[5+fileNameLen];</p><p>  u

83、nsigned int k1,k2,k3;</p><p>  k1=(iSndFileLength/256);</p><p>  k2=(iSndFileLength/256)/256;</p><p>  k3=(iSndFileLength/256)/256/256;</p><p>  sendHeadBuf[4]=fileName

84、Len;</p><p>  sendHeadBuf[3]=k3;</p><p>  sendHeadBuf[2]=k2-k3*256;</p><p>  sendHeadBuf[1]=k1-k2*256-k3*256*256;</p><p>  sendHeadBuf[0]=iSndFileLength-k1*256-k2*256*2

85、56-k3*256*256*256;</p><p>  每次傳送文件的長度定義為4096個字節(jié)byte bTmpDataBuf[4096];每次傳送文件長度將會顯示傳送字節(jié)、下一個傳送的指針地址、文件總長度,代碼如下:</p><p>  sndTmpPtr+=sndLen;</p><p>  iSndFilePtr+=sndTmpPtr;</p>

86、<p>  Form1->Memo1->Lines->Append("傳送文件長度為:"+AnsiString(sndTmpPtr)</p><p>  +"/"+AnsiString(iSndFilePtr)+"/"+AnsiString(iSndFileLength));</p><p>  最后

87、關(guān)閉文件FileClose(iSndFileHandle);</p><p>  當傳送文件結(jié)束時,在Memo1上顯示如下內(nèi)容:</p><p>  Form1->Memo1->Lines->Append("文件"+sndFileName0+"已經(jīng)發(fā)送完成!");</p><p>  Form1->Me

88、mo1->Lines->Append("傳送文件結(jié)束,長度為:"+AnsiString (iSndFilePtr));</p><p>  設(shè)置按鍵1有效Form1->Button1->Enabled=true;</p><p>  到此,文件傳送結(jié)束。</p><p><b>  2、文件接收</b>

89、;</p><p>  服務(wù)器打開偵聽與客戶端連接上之后,在Memo1和StatusBar1上顯示已經(jīng)被“...”連接上,同時按鍵3有效,按鍵1的Caption為斷開連接,代碼如下:</p><p>  Memo1->Lines->Append("已經(jīng)被"+Socket->RemoteAddress+":"+AnsiString (

90、Socket->RemotePort)+"連接上");</p><p>  Button3->Enabled=true;</p><p>  Button1->Caption="斷開連接";</p><p>  StatusBar1->Panels->Items[1]->Text=AnsiS

91、tring("已經(jīng)被"+Socket-> RemoteAddress+":"+AnsiString(Socket->RemotePort)+"連接上");</p><p>  單擊ServerSocket1,在Events的OnClientRead(ClientSocket發(fā)送信息到ServerSocket)處雙擊,代碼窗口中會自動生成一個該

92、控件的基本程序框架。</p><p>  void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,</p><p>  TCustomWinSocket *Socket){ }</p><p>  文件接收的代碼編寫都在大括號里。</p><p>  首先接收頭文件的

93、長度,并在Memo1中顯示,如下:</p><p>  int ReceiveLen=Socket->ReceiveLength();</p><p>  Memo1->Lines->Append("首次接收字節(jié)數(shù):"+AnsiString(k)+"/"+AnsiString (ReceiveLen));</p>&l

94、t;p>  再計算出接收文件的總長度,并在Memo1中顯示</p><p>  int iRcvFileLength;</p><p>  byte *rdTmpFileBuf=new byte[ReceiveLen];</p><p>  iRcvFileLength=rdTmpFileBuf[3];</p><p>  iRcvFi

95、leLength=iRcvFileLength*256+rdTmpFileBuf[2];</p><p>  iRcvFileLength=iRcvFileLength*256+rdTmpFileBuf[1];</p><p>  iRcvFileLength=iRcvFileLength*256+rdTmpFileBuf[0];</p><p>  Memo1-&

96、gt;Lines->Append("將接收的文件長度為:"+AnsiString (iRcvFileLength));</p><p>  由于發(fā)送的時候是按每次4096個字節(jié)來發(fā)送的,所以對應(yīng)于接收文件的長度也是按每次4096個字節(jié)來接收的,代碼如下:</p><p>  iRcvFilePtr+=ReceiveLen;</p><p>

97、  Memo1->Lines->Append("本次接收文件長度為:"+AnsiString(ReceiveLen)</p><p>  +"/"+AnsiString(iRcvFilePtr)+"/"+AnsiString(iRcvFileLength));</p><p>  如果接收文件的指針>=接收文件的

98、總長度,則表明接收文件成功,在Memo1中顯示,并彈出一個提示框,代碼如下:</p><p>  if(iRcvFilePtr>=iRcvFileLength)</p><p><b>  {</b></p><p>  fclose(RcvFp);</p><p>  iRcvFilePtr=-1; //開

99、始新的文件</p><p>  Memo1->Lines->Append("已接收到"+AnsiString(iRcvFileLength)+"字節(jié)文件,保存為"+rcvFileName+"!");</p><p>  Memo1->Lines->Append("");</p>

100、;<p>  ShowMessage("已接收到"+AnsiString(iRcvFileLength)+"字節(jié)文件,保存為"+rcvFileName+"!");</p><p><b>  }</b></p><p>  到此,文件接收結(jié)束。</p><p>  5

101、軟件運行與結(jié)果</p><p><b>  5.1 運行情況</b></p><p>  1、軟件設(shè)計完成之后,將其保存在指定的路徑之下,設(shè)置保存目錄為“E:\文件傳輸\”。</p><p>  2、單擊加速條上的運行按鈕,或按F9運行程序,結(jié)果如圖5-1。在客戶端界面單擊右鍵設(shè)置中心IP地址為127.0.0.1,如圖5-2。</p>

102、;<p>  3、設(shè)置好IP后,單擊服務(wù)器端的“等待接連”按鈕,打開偵聽,如圖5-3所示,然后單擊客戶端的“連接中心”按鈕,與服務(wù)器相連接,連接成功,如圖5-4所示。</p><p>  (a) 客戶端 (b) 服務(wù)器端</p><p>  圖5-1 軟件界面</p><p>  (a) 右鍵

103、彈出菜單 (b) 輸入IP</p><p>  圖5-2 IP設(shè)置</p><p>  圖5-3 服務(wù)器打開偵聽</p><p>  (a) 客戶端 (b) 服務(wù)器端</p><p>  圖5-4 服務(wù)器與客戶端成功連接</p

104、><p>  4、成功連接之后,兩端就可以互相發(fā)送文件了。單擊“向中心發(fā)送文件”按鈕,在彈出的對話框內(nèi)選擇要發(fā)送的文件,如圖5-5,打開選中的文件之后就開始傳送文件,傳送成功后在客戶端的Memo1中顯示文件傳送的信息,在服務(wù)器端的Memo1中顯示文件接收的信息,并在服務(wù)器端彈出一個提示框,如圖5-6。</p><p>  圖5-5 打開文件對話框</p><p>  

105、圖5-6 文件發(fā)送成功</p><p>  5、發(fā)送結(jié)束后,點擊OK,關(guān)閉提示框,然后點界面右上角的叉,退出程序。</p><p>  5.2 有待開發(fā)的地方</p><p>  經(jīng)過測試,在本程序的基礎(chǔ)上還可以做出如下改進:</p><p>  1、一對多發(fā)送文件。目前發(fā)送文件需要設(shè)置IP,只能點對點傳輸,如果要發(fā)送至多人就需要重新設(shè)置I

106、P,比較麻煩。</p><p>  2、選擇保存地址。文件接收到后可以選擇其保存地址,而不是在安裝這個軟件的目錄下。</p><p>  3、文件傳輸服務(wù)器安全問題??梢詫鬏斘募M行加密或加入用戶安全認證系統(tǒng)。</p><p>  4、進一步美化軟件界面。</p><p><b>  6 結(jié) 論</b></p&

107、gt;<p>  本文按照任務(wù)書的要求,首先通過閱讀相關(guān)資料了解TCP/IP協(xié)議,熟悉C++ Builder開發(fā)環(huán)境。在了解了C++ Builder的內(nèi)容以及熟悉面向?qū)ο笙嚓P(guān)技術(shù)之后,又進一步的了解TCP Socket有關(guān)的API函數(shù)及其編程。在熟悉了一系列的相關(guān)知識之后,開始制訂文件實時發(fā)送設(shè)計方案。Internet網(wǎng)絡(luò)技術(shù)發(fā)展迅速,特別是基于網(wǎng)絡(luò)的應(yīng)用服務(wù),已延伸到人們生活中不可缺少的一部分。所以網(wǎng)絡(luò)實時文件傳輸軟件的

108、設(shè)計對于簡單的傳輸文件還是挺有幫助的。</p><p>  該軟件所實現(xiàn)的功能很簡單,只是點對點文件的發(fā)送與接收。盡管如此,在編寫程序的過程中還是碰到了許多的困難。比如,剛接觸到線程這個概念的時候,還不是很能理解它的作用,對于如何創(chuàng)建一個與程序相關(guān)的發(fā)送文件線程,然后用一個主線程去調(diào)用創(chuàng)建的文件發(fā)送線程也不是很明白。程序中文件的發(fā)送是要先計算出文件的長度,然后每次發(fā)送都是按照固定字節(jié)發(fā)送的,相對應(yīng)于接收也是分字節(jié)

109、接收的。對于這個分段發(fā)送文件也困擾了我好久。還有就是最后接收的文件不能對其先重命名然后選擇其保存地址,只能保存在安裝這個軟件的目錄下,目前這個功能還沒有實現(xiàn)。</p><p>  這些待解決的問題是本次設(shè)計中的不足之處,在日后會盡力去解決。</p><p><b>  參考文獻</b></p><p>  [1] 謝希仁譯. TCP/IP協(xié)議族

110、[M]. 北京:清華大學(xué)出版社, 2001,9.</p><p>  [2] International Technical Support Organization. TCP/IP Tutorial and Technical Overview[EB/OL],[2010-9-27]. www.redbooks.ibm.com/redbooks/pdfs/gg2433 76.pdf, December 2006.

111、</p><p>  [3] 任泰明. TCP/IP協(xié)議與網(wǎng)絡(luò)編程[M]. 西安:西安電子科技大學(xué)出版社, 2004,3.</p><p>  [4] 劉永華,于春花,李曉利. Java網(wǎng)絡(luò)編程技術(shù)[M]. 北京:清華大學(xué)出版社, 2008,5.</p><p>  [5] 楊延雙,張建標,王全民. TCP/IP協(xié)議分析及應(yīng)用[M]. 北京:機械工業(yè)出版社, 200

112、7,2.</p><p>  [6] 汪曉平,鐘軍. Visual C++網(wǎng)絡(luò)通信協(xié)議分析與應(yīng)用實現(xiàn)[M]. 北京:人民郵電出版社, 2003,2.</p><p>  [7] 趙強. 基于FTP協(xié)議的文件傳輸服務(wù)器的研究[D]. 大連:大連海事大學(xué), 2008.</p><p>  [8] 馬永琴,李正文,汪劉艷. 基于WinSock的文件互傳[J]. 重慶大學(xué)學(xué)

溫馨提示

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

評論

0/150

提交評論