

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 本科畢業(yè)設(shè)計(jì)</b></p><p><b> ?。?0 屆)</b></p><p> 網(wǎng)絡(luò)實(shí)時(shí)文件傳輸軟件的開(kāi)發(fā)</p><p> 所在學(xué)院 </p><p> 專業(yè)班級(jí) 通信工程
2、 </p><p> 學(xué)生姓名 學(xué)號(hào) </p><p> 指導(dǎo)教師 職稱 </p><p> 完成日期 年 月 </p><p><b> 摘 要</b><
3、;/p><p> 當(dāng)前中國(guó)的互聯(lián)網(wǎng)技術(shù)已經(jīng)進(jìn)入了一個(gè)飛速發(fā)展的時(shí)期,即時(shí)通訊工具作為當(dāng)今網(wǎng)絡(luò)應(yīng)用的主流,越來(lái)越受到了人們的青睞,使人們的網(wǎng)上生活更加豐富多彩?,F(xiàn)在人們開(kāi)發(fā)了越來(lái)越多的軟件使文件傳輸再也不用像以前那么麻煩,它既方便又快捷,能為人們省下很多寶貴的時(shí)間。本畢業(yè)設(shè)計(jì)就是開(kāi)發(fā)了一個(gè)網(wǎng)絡(luò)實(shí)時(shí)文件傳輸?shù)能浖?lt;/p><p> 本設(shè)計(jì)的開(kāi)發(fā)采用C/S結(jié)構(gòu),在基于C++ Builder開(kāi)發(fā)
4、環(huán)境下,使用C++編程語(yǔ)言進(jìn)行開(kāi)發(fā)。本文首先論述了現(xiàn)今傳輸軟件的發(fā)展方向,并對(duì)開(kāi)發(fā)環(huán)境和開(kāi)發(fā)的主要內(nèi)容進(jìn)行了簡(jiǎn)單的介紹。本設(shè)計(jì)所開(kāi)發(fā)的軟件是基于TCP/IP協(xié)議,論文中也介紹了TCP/IP協(xié)議和FTP的一些相關(guān)知識(shí)。本文還論述了線程的概念、優(yōu)缺點(diǎn)以及在C++ Builder中的實(shí)現(xiàn),重點(diǎn)介紹了軟件的開(kāi)發(fā)思路和程序中關(guān)鍵代碼的解析。通過(guò)運(yùn)行、測(cè)試與分析,該軟件運(yùn)行穩(wěn)定、可靠,具有一定的實(shí)用價(jià)值。</p><p>
5、 關(guān)鍵詞:C++ Builder;TCP/IP協(xié)議;實(shí)時(shí)文件傳輸</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特點(diǎn)3</p><p> 2.2 TCP/IP協(xié)議體系結(jié)構(gòu)3</p><p>
12、2.3 TCP/IP傳輸文件機(jī)制5</p><p> 2.4 FTP文件傳輸知識(shí)5</p><p><b> 3 線程7</b></p><p> 3.1 線程的概念.7</p><p> 3.2 使用線程的優(yōu)缺點(diǎn)7</p><p> 3.3 線程在C++ Builder中的
13、實(shí)現(xiàn)7</p><p> 4 文件傳輸?shù)膶?shí)現(xiàn)10</p><p> 4.1 總體方案10</p><p> 4.2 C++ Builder開(kāi)發(fā)環(huán)境10</p><p> 4.3 用于文件傳輸?shù)慕M件11</p><p> 4.4 文件傳輸協(xié)議12</p><p> 4.5
14、 文件傳輸軟件設(shè)計(jì)13</p><p> 4.5.1 設(shè)計(jì)思路13</p><p> 4.5.2 軟件界面框架構(gòu)建13</p><p> 4.5.3 關(guān)鍵代碼分析15</p><p> 5 軟件運(yùn)行與結(jié)果20</p><p> 5.1 運(yùn)行情況20</p><p> 5
15、.2 有待開(kāi)發(fā)的地方23</p><p><b> 6 結(jié) 論24</b></p><p><b> 致 謝25</b></p><p><b> 參考文獻(xiàn)26</b></p><p> 附錄1 主要源程序代碼27</p><p>
16、; 附錄2 畢業(yè)設(shè)計(jì)作品說(shuō)明書41</p><p><b> 1 概述</b></p><p> 1.1 課題研究背景及意義</p><p> 網(wǎng)絡(luò)是一個(gè)激動(dòng)人心的領(lǐng)域,編寫網(wǎng)絡(luò)上的應(yīng)用程序更是很多程序員所向往的,然而編寫網(wǎng)絡(luò)程序需要掌握大量的網(wǎng)絡(luò)傳輸協(xié)議、編程接口和WinSock32 API函數(shù)。20世紀(jì)90年代以來(lái),計(jì)算機(jī)網(wǎng)絡(luò)
17、技術(shù)和信息處理技術(shù)在全世界范圍得到了迅猛發(fā)展,基于TCP/IP協(xié)議的文件傳輸和即時(shí)聊天系統(tǒng)迅速成為數(shù)據(jù)通信網(wǎng)絡(luò)上最常用的的應(yīng)用。</p><p> 隨著Internet和局域網(wǎng)的飛速發(fā)展和普及,越來(lái)越多的企業(yè)、事業(yè)單位和學(xué)校都已經(jīng)建成局域網(wǎng)并接上了Internet。在局域網(wǎng)或Internet上很需要一些軟件能夠很方便快捷地實(shí)現(xiàn)互相發(fā)送信息和傳送文件等功能?,F(xiàn)在用戶可以通過(guò)QQ、MSN、郵箱、FTP等傳送文件,不
18、過(guò)對(duì)于需要傳送容量比較大的文件就有些費(fèi)時(shí)。</p><p> 本課題所要完成的是用C++ Builder設(shè)計(jì)一個(gè)基于TCP/IP協(xié)議的點(diǎn)對(duì)點(diǎn)的文件發(fā)送和接收。和FTP相比,我所要設(shè)計(jì)的軟件不需要服務(wù)器,直接點(diǎn)對(duì)點(diǎn)傳輸,安全性高,如果加密的話就算文件在傳輸?shù)臅r(shí)候被截,別人也看不到正確的內(nèi)容,只有接受方解密后才能閱讀。該軟件既節(jié)省了網(wǎng)絡(luò)帶寬又提高了傳輸速度,給網(wǎng)絡(luò)用戶帶來(lái)了很大的方便。</p><
19、;p> 1.2 研究開(kāi)發(fā)和論文內(nèi)容</p><p> 1、開(kāi)發(fā)工作主要內(nèi)容</p><p> 利用C++ Builder設(shè)計(jì)一個(gè)軟件,能夠?qū)崿F(xiàn)文件實(shí)時(shí)點(diǎn)對(duì)點(diǎn)發(fā)送與接收。設(shè)計(jì)中進(jìn)行建立Socket連接,首先需要設(shè)置IP地址然后打開(kāi)服務(wù)器開(kāi)始偵聽(tīng)。當(dāng)服務(wù)器與客戶端連接上之后才能發(fā)送文件,如果服務(wù)器未開(kāi)始偵聽(tīng)或者未連上服務(wù)器,則彈出提示框“網(wǎng)絡(luò)故障,請(qǐng)檢查服務(wù)器是否打開(kāi)?”。當(dāng)客戶端
20、與服務(wù)器成功連接后,可以由客戶端向服務(wù)器發(fā)送文件,也可以由服務(wù)器向客戶端發(fā)送文件,然后點(diǎn)擊文件發(fā)送的按鈕,就能成功的接收到文件,并彈出一個(gè)提示框提示用戶表明文件發(fā)送成功,然后還能在顯示文本處顯示出文件發(fā)送過(guò)程中一系列的內(nèi)容。</p><p> 為實(shí)現(xiàn)以上內(nèi)容,主要需要對(duì)TCP/IP協(xié)議、C++ Builder開(kāi)發(fā)平臺(tái)、界面開(kāi)發(fā)以及Socket編程進(jìn)行研究。</p><p><b&g
21、t; 2、論文內(nèi)容</b></p><p> 論文分成六章來(lái)介紹在C++ Builder平臺(tái)下網(wǎng)絡(luò)實(shí)時(shí)文件傳輸軟件的開(kāi)發(fā),從開(kāi)發(fā)所需要的相關(guān)知識(shí)到開(kāi)發(fā)的方案以及開(kāi)發(fā)過(guò)程都有所涉及。第一章概述介紹了本課題的背景、意義和研究開(kāi)發(fā)的主要內(nèi)容。第二章介紹了TCP/IP技術(shù)與FTP文件傳輸,主要介紹了TCP/IP協(xié)議的相關(guān)知識(shí)和FTP相關(guān)知識(shí)。第三章為線程,介紹了線程的概念、使用線程的優(yōu)缺點(diǎn)和在C++ Bu
22、ilder中的實(shí)現(xiàn)。第四章是總體的方案和C++ Builder開(kāi)發(fā)平臺(tái),重點(diǎn)介紹了軟件開(kāi)發(fā)的思路以及程序中關(guān)鍵代碼的解析。第五章給出了軟件的運(yùn)行結(jié)果,同時(shí)講述了本次設(shè)計(jì)的不足的地方。最后一章為結(jié)論部分,對(duì)整個(gè)論文工作情況進(jìn)行總結(jié)。</p><p> 2 TCP/IP技術(shù)與FTP文件傳輸</p><p> 2.1 TCP/IP特點(diǎn)</p><p> 傳輸層協(xié)議
23、(TCP、UDP),網(wǎng)絡(luò)層協(xié)議(IP)和物理接口層是TCP/IP協(xié)議的核心部分,這三層通常是在操作系統(tǒng)內(nèi)核中實(shí)現(xiàn)。編程時(shí),編程界面有兩種形式:(1) 是由內(nèi)核心直接提供的系統(tǒng)調(diào)用;(2) 使用以庫(kù)函數(shù)方式提供的各種函數(shù)。前者為核內(nèi)實(shí)現(xiàn),后者為核外實(shí)現(xiàn)。用戶服務(wù)要通過(guò)核外的應(yīng)用程序才能實(shí)現(xiàn),所以要使用套接字(Socket)來(lái)實(shí)現(xiàn)[1]。</p><p> 2.2 TCP/IP協(xié)議體系結(jié)構(gòu)</p>&
24、lt;p> TCP/IP協(xié)議源于1969年,是針對(duì)Internet開(kāi)發(fā)的一種體系結(jié)構(gòu)和協(xié)議標(biāo)準(zhǔn),目的在于解決異種計(jì)算機(jī)網(wǎng)絡(luò)的通信問(wèn)題。使得網(wǎng)絡(luò)在互聯(lián)時(shí)能為用戶提供一種通用、一致的通信服務(wù)[2]。</p><p> TCP/IP協(xié)議實(shí)際上就是在物理網(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),主要負(fù)責(zé)主機(jī)間數(shù)據(jù)的路由和網(wǎng)絡(luò)上數(shù)據(jù)的存儲(chǔ)。同時(shí)為ICMP、TCP、UDP提供分組發(fā)送服務(wù)。用戶進(jìn)程通常不需要涉及這一層。</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)間報(bào)文控制協(xié)議(Internet Control Message Protocol),此協(xié)議處理信關(guān)和主機(jī)的差錯(cuò)和傳送控制。</p><p> UDP:用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol),這是提供給用戶進(jìn)程的無(wú)連接協(xié)議,用于傳送數(shù)據(jù)而不執(zhí)行
27、正確性檢查。</p><p> TCP:傳送控制協(xié)議(Transmission Control Protocol),這是一種提供給用戶進(jìn)程的可靠的全雙工字節(jié)流面向連接的協(xié)議。它要為用戶進(jìn)程提供虛電路服務(wù),并為數(shù)據(jù)可靠傳輸建立檢查。(注:大多數(shù)網(wǎng)絡(luò)用戶程序使用TCP)</p><p> SMTP:簡(jiǎn)單郵件傳送協(xié)議(Simple Mail Transfer Protocol),SMTP協(xié)議
28、為系統(tǒng)之間傳送電子郵件。</p><p> TELNET:終端協(xié)議(Telnet Terminal Procotol),允許用戶以虛終端方式訪問(wèn)遠(yuǎn)程主機(jī)。</p><p> FTP:文件傳輸協(xié)議(File Transfer Protocol),允許用戶以文件操作的方式(文件的增、刪、改、查、傳送等)與另一主機(jī)相互通信。</p><p> HTTP:超文本傳輸協(xié)
29、議(Hypertext Transfer Procotol)</p><p> TFTP:簡(jiǎn)單文件傳輸協(xié)議(Trivial File Transfer Protocol)</p><p> IP協(xié)議在每個(gè)包頭上加上接收端主機(jī)地址,這樣方便數(shù)據(jù)找到自己要去的地方,如果在傳輸過(guò)程中出現(xiàn)數(shù)據(jù)丟失、失真等情況,TCP協(xié)議會(huì)自動(dòng)要求數(shù)據(jù)重傳[3]。</p><p> T
30、CP/IP協(xié)議的基本傳輸單位是數(shù)據(jù)包(Datagram),TCP協(xié)議負(fù)責(zé)把數(shù)據(jù)分成若干個(gè)數(shù)據(jù)包,然后給每個(gè)數(shù)據(jù)包加上包頭,包頭上有相應(yīng)的編號(hào),用以保證在數(shù)據(jù)接收端能將數(shù)據(jù)還原為原來(lái)的格式[4]。</p><p> 2.3 TCP/IP傳送文件機(jī)制</p><p> 物理層通過(guò)MAC地址向鏈路層傳送數(shù)據(jù)幀;鏈路層使用TYPE或DASP(Destination Service Access
31、 Point)識(shí)別IP協(xié)議;網(wǎng)絡(luò)層根據(jù)協(xié)議號(hào)識(shí)別TCP或UDP;傳輸層經(jīng)端口號(hào)訪問(wèn)各種應(yīng)用服務(wù)[5],如圖2-2所示。</p><p> 2.4 FTP文件傳送知識(shí)</p><p> FTP協(xié)議(File Transfer Protocol)是互聯(lián)網(wǎng)的主要傳輸機(jī)制,它能夠?qū)崿F(xiàn)在不同的計(jì)算機(jī)、不同的操作系統(tǒng)、不同的網(wǎng)絡(luò)之間進(jìn)行文件傳輸。從根本上說(shuō),F(xiàn)TP就是在網(wǎng)絡(luò)中各種不同的計(jì)算機(jī)之間按
32、照TCP/IP協(xié)議來(lái)傳輸文件。FTP的主要作用就是讓用戶連接上一個(gè)遠(yuǎn)程計(jì)算機(jī)(這些計(jì)算機(jī)上運(yùn)行著FTP服務(wù)器程序)察看遠(yuǎn)程計(jì)算機(jī)有哪些文件,然后把本地計(jì)算機(jī)的文件送到遠(yuǎn)程計(jì)算機(jī)上去,或把文件從遠(yuǎn)程計(jì)算機(jī)上拷到本地計(jì)算機(jī)。</p><p> FTP采用的也是現(xiàn)在流行的C/S(客戶機(jī)/服務(wù)器)模式,由FTP客戶端程序和FTP服務(wù)器端程序組成。通常服務(wù)器是遠(yuǎn)程站點(diǎn),用戶可以通過(guò)Internet網(wǎng)絡(luò)連接到遠(yuǎn)程的FTP服
33、務(wù)器站點(diǎn)。當(dāng)然并非所有的站點(diǎn)用戶都有權(quán)限訪問(wèn),有些服務(wù)器需要用戶有一定的訪問(wèn)權(quán)限。FTP站點(diǎn)可以是公共的,任何能連接上Internet的人都能夠訪問(wèn);也可以是私有的,當(dāng)然這個(gè)時(shí)候就必須具備一定的權(quán)限,比如有相應(yīng)的用戶名和密碼;或者是兩種性質(zhì)都有,這時(shí)可能能訪問(wèn)和操作其中的一部分內(nèi)容[6]。</p><p> 用戶通過(guò)客戶機(jī)程序向服務(wù)器程序發(fā)出命令,服務(wù)器程序執(zhí)行用戶所發(fā)出的命令,并將執(zhí)行的結(jié)果返回到客戶機(jī)。以下
34、載文件為例,當(dāng)你啟動(dòng)FTP從遠(yuǎn)程計(jì)算機(jī)拷貝文件時(shí)實(shí)際上啟動(dòng)了兩個(gè)程序:一個(gè)本地機(jī)上的FTP客戶程序,它向FTP服務(wù)器提出拷貝文件的請(qǐng)求。另一個(gè)是啟動(dòng)在遠(yuǎn)程計(jì)算機(jī)的上的FTP服務(wù)器程序,它響應(yīng)你的請(qǐng)求把你指定的文件傳送到你的計(jì)算機(jī)中。</p><p> 使用FTP時(shí)必須先登錄,在遠(yuǎn)程主機(jī)上獲得相應(yīng)的權(quán)限以后,方可下載或上傳文件。FTP服務(wù)器可以進(jìn)行各種設(shè)置,比如有些目錄讀寫刪除屬性等。像現(xiàn)在許多公共的FTP站點(diǎn)都
35、會(huì)有幾種權(quán)限的目錄,一種是讓用戶下載,除此之外,用戶不能進(jìn)行其他的操作,如“/public”等;而有些是讓用戶上傳或者刪除的,如“/incoming”等。對(duì)于一些公共的FTP站點(diǎn),不管在服務(wù)器端有沒(méi)有賬號(hào)都能夠下載文件,這就被稱為“匿名(Anonymous)FTP”。當(dāng)連接到一個(gè)匿名服務(wù)器的時(shí)候,通常指定“anonymous”作為用戶名,以“guest”或者電子郵件作為密碼[6]。</p><p> 當(dāng)遠(yuǎn)程主機(jī)
36、提供匿名FTP服務(wù)時(shí),作為一種安全措施,大多數(shù)匿名FTP主機(jī)都允許用戶從其下載文件,而不允許用戶向其上傳文件,即使有些匿名FTP主機(jī)確實(shí)允許用戶上傳文件,用戶也只能將文件上傳至某一指定上傳目錄中。隨后,系統(tǒng)管理員會(huì)去檢查這些文件,他會(huì)將這些文件移至另一個(gè)公共下載目錄中,供其他用戶下載,利用這種方式,遠(yuǎn)程主機(jī)的用戶得到了保護(hù),避免了有人上傳有問(wèn)題的文件,如帶病毒的文件[7]。</p><p><b>
37、3 線程</b></p><p><b> 3.1 線程的概念</b></p><p> 線程是計(jì)算機(jī)中獨(dú)立運(yùn)行的最小單位,運(yùn)行時(shí)占用很少的系統(tǒng)資源。由于每個(gè)線程占用的CPU時(shí)間是由系統(tǒng)分配的,因此可以把線程看成操作系統(tǒng)分配CPU時(shí)間的基本單位。在用戶看來(lái),多個(gè)線程是同時(shí)執(zhí)行的,但從操作系統(tǒng)調(diào)度上看,各個(gè)線程是交替執(zhí)行的。系統(tǒng)不停地在各個(gè)線程之間切換
38、,每個(gè)線程只有在系統(tǒng)分配給它的時(shí)間片內(nèi)才能取得CPU的控制權(quán),執(zhí)行線程中的代碼[6]。在系統(tǒng)中,正確使用線程能夠很好的提高應(yīng)用程序的性能及運(yùn)行效率,實(shí)現(xiàn)原理是將一個(gè)進(jìn)程分成多個(gè)線程,然后讓它們并發(fā)異步執(zhí)行,來(lái)提高效率。</p><p> 3.2 使用線程的優(yōu)缺點(diǎn)</p><p> 使用線程的缺點(diǎn):(1) 跟蹤大量的線程將占用大量的處理器的時(shí)間。如果線程過(guò)多,則其中大多數(shù)線程都不會(huì)產(chǎn)生明
39、顯的進(jìn)度。如果大多數(shù)當(dāng)前線程處于一個(gè)進(jìn)程中,則其他進(jìn)程中的線程的調(diào)度頻率就會(huì)很低;(2) 使用許多線程控制代碼執(zhí)行非常復(fù)雜,并可能產(chǎn)生許多錯(cuò)誤;(3) 銷毀線程需要了解可能發(fā)生的問(wèn)題并對(duì)那些問(wèn)題進(jìn)行處理。</p><p> 引入線程的好處:(1) 創(chuàng)建一個(gè)新線程花費(fèi)的時(shí)間少;(2) 兩個(gè)線程的切換時(shí)間少;(3) 由于同一個(gè)進(jìn)程內(nèi)的線程共享內(nèi)存和文件,所以線程之間互相通信必須調(diào)用內(nèi)核;(4) 線程能獨(dú)立執(zhí)行,能充
40、分利用和發(fā)揮處理機(jī)與外圍設(shè)備并行工作的能力。</p><p> 3.3 線程在C++ Builder中的實(shí)現(xiàn)</p><p> 一個(gè)應(yīng)用程序,在需要的時(shí)候可以有許多個(gè)執(zhí)行線程,每個(gè)線程就是一個(gè)小的執(zhí)行程序,操作系統(tǒng)自動(dòng)使各個(gè)線程共享CPU資源,確保任一線程都不能使系統(tǒng)死鎖。這樣,在編程的時(shí)候,可以把費(fèi)時(shí)間的任務(wù)移到后臺(tái),在前臺(tái)用另一個(gè)線程接受用戶的輸入。對(duì)那些對(duì)實(shí)時(shí)性要求比較高的編程任
41、務(wù),如網(wǎng)絡(luò)客戶服務(wù)、串行通信等應(yīng)用時(shí),多線程的實(shí)現(xiàn)無(wú)疑大大地增強(qiáng)了程序的可用性和穩(wěn)固性。</p><p> 線程同進(jìn)程一樣是實(shí)現(xiàn)Windows系統(tǒng)多任務(wù)的一種重要機(jī)制,提供了進(jìn)行多任務(wù)處理的能力。任何一個(gè)進(jìn)程在被創(chuàng)建后都必須同時(shí)啟動(dòng)一個(gè)主線程,也就是說(shuō)一個(gè)進(jìn)程至少要擁有一個(gè)線程。線程只能存在于某個(gè)進(jìn)程環(huán)境中,其生命周期也被限制在其內(nèi),一旦進(jìn)程終止,它所包含的全部線程也將同時(shí)被撤銷[8]。使用線程所帶來(lái)的最大優(yōu)勢(shì)
42、是可以充分利用CPU資源并大幅度提升程序的并行處理能力。</p><p><b> 1、創(chuàng)建多線程程序</b></p><p> 首先,先介紹一下實(shí)現(xiàn)多線程的具體步驟。在C++ Builder中雖然用Tthread對(duì)象說(shuō)明了線程的概念,但是Tthread對(duì)象本身并不完整,需要在TThread下新建其子類,并重載Execute方法來(lái)使用線程對(duì)象。</p>
43、<p> 在C++ Builder IDE環(huán)境下選擇菜單File|New,在New欄中選中Thread Object,按OK,接下來(lái)彈出輸入框,輸入TThread對(duì)象子類的名字MyThread,這樣C++ Builder自動(dòng)為你創(chuàng)建了一個(gè)名為TMyThread的TThread子類。同時(shí)編輯器中多了一個(gè)名為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ù)就是我們要在線程中實(shí)現(xiàn)的任務(wù)的代碼所在處。在原代碼中包
51、含Unit2.cpp,這個(gè)由我們創(chuàng)建的TMyThread對(duì)象就可以使用了。</p><p> 以上初步地實(shí)現(xiàn)了在程序中創(chuàng)建一個(gè)自定義的線程,并使程序?qū)崿F(xiàn)了多線程應(yīng)用。但是,多線程應(yīng)用的實(shí)現(xiàn),并不是一件簡(jiǎn)單的工作,還需要考慮很多使多個(gè)線程能在系統(tǒng)中共存、互不影響的因素。比如,程序中公共變量的訪問(wèn)、資源的分配,如果處理不當(dāng),不僅線程會(huì)死鎖陷入混亂,甚至可能會(huì)造成系統(tǒng)崩潰。總的來(lái)講,在多線程編程中要注意共享對(duì)象和數(shù)據(jù)
52、的處理,不能忽視。</p><p> 2、線程同步的三種實(shí)現(xiàn)方法</p><p> (1) 利用互斥對(duì)象實(shí)現(xiàn);互斥對(duì)象(mutex)屬于內(nèi)核對(duì)象,它能夠確保線程擁有對(duì)單個(gè)資源的互斥訪問(wèn)權(quán)?;コ鈱?duì)象包含一個(gè)使用數(shù)量,一個(gè)線程ID和一個(gè)計(jì)數(shù)器。(2) 利用事件對(duì)象實(shí)現(xiàn);事件對(duì)象也屬于內(nèi)核對(duì)象,它包含三個(gè)成員:使用計(jì)數(shù)、指明該事件是自動(dòng)重置事件還是人工重置事件的標(biāo)志位、指明該事件處于已通知狀
53、態(tài)還是未通知狀態(tài)的標(biāo)志位。(3) 利用關(guān)鍵代碼段實(shí)現(xiàn);關(guān)鍵代碼段也稱為臨界區(qū),工作在用戶方式下。它是指一小段代碼段,在代碼能夠執(zhí)行前,它必須獨(dú)占對(duì)某些資源的訪問(wèn)權(quán)[9]。</p><p> 多線程是為了使得多個(gè)線程并行的工作以完成多項(xiàng)任務(wù),以提高系統(tǒng)的效率。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候被實(shí)現(xiàn)的。</p><p> 4 文件傳輸?shù)膶?shí)現(xiàn)</p><p>
54、<b> 4.1 總體方案</b></p><p> 本次課題的目標(biāo)是設(shè)計(jì)一個(gè)網(wǎng)絡(luò)實(shí)時(shí)文件傳輸?shù)能浖?。編程中需要建立一個(gè)客戶端和一個(gè)服務(wù)器端,兩者可以互傳文件。首先,在客戶端和服務(wù)器端各創(chuàng)建一個(gè)主線程mySndFileThread和一個(gè)文件發(fā)送線程TSndFileThread,在程序執(zhí)行時(shí)由主線程調(diào)用文件發(fā)送線程。打開(kāi)一個(gè)文件,先計(jì)算出發(fā)送的文件長(zhǎng)度,然后顯示出文件打開(kāi)的路徑。發(fā)送端將要
55、傳送的文件分成指定大小的N個(gè)包,在每個(gè)包前加個(gè)包頭,因?yàn)榉?wù)器需要通過(guò)包頭知道傳送過(guò)來(lái)的是數(shù)據(jù)還是路徑(因?yàn)榭蛻舳酥付ù娣怕窂剑邮斩耸盏綌?shù)據(jù)后必須返回確認(rèn)到發(fā)送端,這樣才能循環(huán)發(fā)送,但一定要有最后的終止,不然會(huì)死循環(huán)[10]。然后定義文件包的傳輸長(zhǎng)度byte bTmpDataBuf[4096];每次傳送文件的長(zhǎng)度為4096,最后一個(gè)包可能會(huì)小于4096,接收端對(duì)應(yīng)于顯示首次接收字節(jié)數(shù)、包頭、名稱、本次接收文件的長(zhǎng)度等。最后文件發(fā)送成
56、功則彈出一個(gè)提示框顯示接收到的字節(jié)和保存路徑。相應(yīng)地,基于Socket編程的可靠性,服務(wù)器也能向客戶端發(fā)送文件。</p><p> 與FTP相比,本軟件不需要服務(wù)器,直接點(diǎn)對(duì)點(diǎn)傳輸,而且安全性比較高,如果加密的話就算被截,別人也看不到正確的內(nèi)容,只有接收方解密后才能閱讀。</p><p> 4.2 C++ Builder開(kāi)發(fā)環(huán)境</p><p> 本畢業(yè)設(shè)計(jì)的
57、軟件開(kāi)發(fā)使用到C++編程語(yǔ)言,借助C++ Builder6開(kāi)發(fā)工具來(lái)實(shí)現(xiàn),操作系統(tǒng)是Microsoft Windows XP。</p><p> Borland C++ Builder是Borland公司推出的全新32位Windows開(kāi)發(fā)工具。C++ Builder不僅繼承了Delphi使用簡(jiǎn)便,功能強(qiáng)大,效率高等特點(diǎn),而且它還結(jié)合C++語(yǔ)言所有優(yōu)點(diǎn)。C++ Builder可以說(shuō)是至今最好的Windows開(kāi)發(fā)工
58、具。C++ Builder6是一款快速開(kāi)發(fā)Win32應(yīng)用程序的可視化開(kāi)發(fā)工具,利用它可以實(shí)現(xiàn)高性能執(zhí)行效率和出色的底層控制[11]。C++ Builder6相比于以前的版本,提供了更多的網(wǎng)絡(luò)開(kāi)發(fā)組件,更快速方便的可視化環(huán)境。</p><p> C++ Builder6集成開(kāi)發(fā)環(huán)境包含可視化窗體設(shè)計(jì)器,對(duì)象觀察器、組件面板、工程管理器、源代碼編輯器、調(diào)試程序以及安裝工具等。在該窗體設(shè)計(jì)器中,你可以自由地移動(dòng)可視化
59、表示的對(duì)象,同時(shí)在對(duì)象觀察器中編輯該對(duì)象的初始化運(yùn)行時(shí)狀態(tài),在源代碼編輯器中編輯該對(duì)象執(zhí)行的邏輯。改變對(duì)象與代碼有關(guān)聯(lián)的屬性,比如改變事件句柄的名字時(shí),對(duì)象觀察器會(huì)自動(dòng)地改變相應(yīng)的源代碼。另外,在源代碼編輯器中更改該對(duì)象的源代碼,比如在窗體類聲明中改變事件句柄的名字時(shí),對(duì)象觀察器也會(huì)立即反映出相應(yīng)的變化[12]。圖4-1是C++ Builder6的設(shè)計(jì)界面。</p><p> 圖4-1 C++ Builder
60、6設(shè)計(jì)界面</p><p> 4.3 用于文件傳輸?shù)慕M件</p><p> 本次設(shè)計(jì)分為客戶端和服務(wù)器兩個(gè)部分。</p><p> 1、客戶端用到的組件</p><p> 建立兩個(gè)窗體Form,把Form1和Form3的Caption分別改為現(xiàn)場(chǎng)文件服務(wù)系統(tǒng)和IP設(shè)置。向窗體Form1中添加的控件有:一個(gè)Memo控件、兩個(gè)Button
61、控件、一個(gè)ClientSocket控件、一個(gè)OpenDialog控件、一個(gè)PopupMenu控件和一個(gè)StausBar控件。向窗體Form3添加的控件有:兩個(gè)Button控件、一個(gè)Label控件和一個(gè)Edit控件。</p><p> 2、服務(wù)器端用到的組件</p><p> 建立一個(gè)窗體Form1,將其Caption改為中心文件服務(wù)系統(tǒng)。向窗體Form1中添加的控件有:一個(gè)Memo控件
62、、兩個(gè)Button控件、一個(gè)ServerSocket控件、一個(gè)OpenDialog控件和一個(gè)StausBar控件。</p><p> 4.4 文件傳輸協(xié)議</p><p> 通信協(xié)議是指通信雙方的一種約定。約定包括對(duì)數(shù)據(jù)格式、同步方式、傳送速度、傳送步驟、檢糾錯(cuò)方式以及控制字符定義等問(wèn)題做出統(tǒng)一規(guī)定,通信雙方必須共同遵守[13]。</p><p> 在編程中如
63、何實(shí)現(xiàn)文件的數(shù)據(jù)傳輸呢?把文件分成兩個(gè)部分,頭文件包括文件大小、文件名、文件名長(zhǎng)度,后一部分為文件的內(nèi)容,程序中先發(fā)送頭文件。然后把文件拆分成N個(gè)包,每個(gè)包數(shù)據(jù)為4096字節(jié)[14]。在內(nèi)存中數(shù)據(jù)是用十六進(jìn)制保存的,也就是說(shuō)一字節(jié)數(shù)據(jù)可表示的范圍是00~FF,它的十進(jìn)制表示是0~255。</p><p> 程序中用iSndFileLength=FileSeek(iSndFileHandle,0,2);獲取文件的
64、長(zhǎng)度,F(xiàn)ileHandle是文件句柄。句柄實(shí)際就是結(jié)構(gòu)體指針,但系統(tǒng)不允許你直接訪問(wèn)該結(jié)構(gòu)體成員,所以稱其為“句柄”,只應(yīng)該用專門的處理函數(shù)取操作該句柄,而不是應(yīng)該直接訪問(wèn)結(jié)構(gòu)體成員。舉個(gè)例子:如果你想讀一個(gè)文件的內(nèi)容,首先通過(guò)一個(gè)findfile(“文件名”)的函數(shù)找到那個(gè)文件,這個(gè)函數(shù)就給你一個(gè)關(guān)于這個(gè)文件名的句柄,就是相當(dāng)于使用權(quán)限,你以后讀、寫或刪除這個(gè)文件的時(shí)候都要告訴系統(tǒng),你有這個(gè)權(quán)限操作這個(gè)文件。FileSeek()函數(shù)中
65、0=文件頭,2=文件尾。計(jì)算出文件的總長(zhǎng)度,然后按照每個(gè)包4096字節(jié)發(fā)送,每發(fā)完一次文件指針就會(huì)指向下一個(gè)包要發(fā)送的文件頭依次類推,最后一個(gè)包可能會(huì)小于4096。</p><p> 圖4-2 文件傳輸協(xié)議</p><p> 如圖4-2,前面四個(gè)FF表示存放頭文件的大小、文件名、文件名長(zhǎng)度等字節(jié)數(shù),F(xiàn)F實(shí)際表示是兩位的16進(jìn)制最大值。假如前四個(gè)大小依次為20,20,10,50,其長(zhǎng)度
66、為20+20*256+10*256*256+50*256*256*256,其后的文件內(nèi)容字節(jié)數(shù)依次類推。在接收端也對(duì)應(yīng)于發(fā)送端,每次發(fā)送多少字節(jié)就接收多少字節(jié)。</p><p> 4.5 文件傳輸軟件設(shè)計(jì)</p><p> 4.5.1 設(shè)計(jì)思路</p><p> 本次設(shè)計(jì)是網(wǎng)絡(luò)實(shí)時(shí)文件傳輸軟件的開(kāi)發(fā),程序的設(shè)計(jì)思路大致如下:先建立客戶端和服務(wù)器端,打開(kāi)服務(wù)器開(kāi)
67、始偵聽(tīng),雙擊窗體Form1中的Button1控件,在彈出的代碼窗口中的Button1Click()事件中添加代碼。然后在客戶端設(shè)置好IP后與服務(wù)器連接??蛻舳撕头?wù)器的StatusBar->Panels->Items[0]的文本顯示為“本地IP地址:...”,Items[1]提示為“尚未連接”。連接上服務(wù)器后Items[1]提示為“已經(jīng)被......連接上”。單擊發(fā)送文件按鈕打開(kāi)選擇一個(gè)文件由客戶端向服務(wù)器發(fā)送文件,服務(wù)器能
68、接收到文件,彈出一個(gè)提示框表明文件發(fā)送完成。在服務(wù)器的Memo1中會(huì)顯示發(fā)送文件的長(zhǎng)度、文件名、文件打開(kāi)路徑、本次接收字節(jié)、保存路徑等內(nèi)容。也可以由服務(wù)器向客戶端發(fā)送文件,操作步驟與客戶端發(fā)送文件一致。當(dāng)發(fā)送完成不需要發(fā)送文件時(shí),再在服務(wù)器的Button1Click()事件中添加代碼ServerSocket1->Socket->Close();關(guān)閉服務(wù)器斷開(kāi)連接,也可以關(guān)閉客戶端斷開(kāi)連接。</p><p&
69、gt; 4.5.2 軟件界面框架構(gòu)建</p><p><b> 1、客戶端界面</b></p><p> 運(yùn)行C++ Builder6,創(chuàng)建一個(gè)窗體Form3將其Caption改為“IP設(shè)置”。所需的控件:兩個(gè)Button控件、一個(gè)Label控件和一個(gè)Edit控件。將Label控件的Caption設(shè)置為“輸入中心IP地址:”。Edit控件可以顯示少量文本信息,設(shè)
70、置其Text為一個(gè)IP地址,如61.153.150.57。然后分別設(shè)置Button1和Button2控件的Caption為“確定”和“取消”。</p><p> 創(chuàng)建一個(gè)窗體Form1將其Caption設(shè)置為“現(xiàn)場(chǎng)文件服務(wù)系統(tǒng)”。所需的控件:一個(gè)Memo控件、兩個(gè)Button控件、一個(gè)ClientSocket控件、一個(gè)OpenDialog控件、一個(gè)PopupMenu控件和一個(gè)StausBar控件。Memo1控件
71、是用來(lái)顯示文本的,文件傳輸過(guò)程的內(nèi)容將顯示在其中。選中它之后,在對(duì)象檢視器里設(shè)置它的屬性。這里需要修改的屬性是ScrollBars,把ScrollBars屬性項(xiàng)設(shè)置成ssVertical,使Memo1在顯示文本的時(shí)候有垂直滾動(dòng)條。StausBar控件用以顯示程序的運(yùn)行狀況,單擊Panels屬性項(xiàng)右端的“…”按鈕,在彈出的對(duì)話框中添加兩個(gè)TStatusPanels,Items[0]的Text設(shè)置為“本地IP地址:”,Items[1]的Te
72、xt設(shè)置為“尚未連接”。然后分別設(shè)置Button1和Button2控件的Caption為“向中心發(fā)送文件”和“連接中心”。Button2控件其實(shí)就是單擊響應(yīng)事件,在這個(gè)程序里單擊它就能與服務(wù)器相連接。而OpenDialog1的作用是打開(kāi)一個(gè)對(duì)話框,它被放在Button1單擊響應(yīng)事件中,用來(lái)在單擊事件發(fā)生后顯</p><p> 圖4-3 客戶端軟件界面</p><p><b>
73、 2、服務(wù)器端界面</b></p><p> 運(yùn)行C++ Builder6,創(chuàng)建一個(gè)窗體Form1將其Caption改為中心文件服務(wù)系統(tǒng)。所需的控件是:一個(gè)Memo控件、兩個(gè)Button控件、一個(gè)ServerSocket控件、一個(gè)OpenDialog控件和一個(gè)StausBar控件。分別設(shè)置Button1和Button3控件的Caption為“等待連接”和“向現(xiàn)場(chǎng)發(fā)送文件”。其他控件設(shè)置與客戶端一致
74、,最后程序界面如圖4-4所示。</p><p> 圖4-4 服務(wù)器端軟件界面</p><p> 4.5.3 關(guān)鍵代碼分析</p><p> 先在服務(wù)器端打開(kāi)偵聽(tīng),單擊ServerSocket1,在Events的OnListen處雙擊,代碼窗口中會(huì)自動(dòng)生成一個(gè)該控件的基本程序框架。</p><p> void __fastcall T
75、Form1::ServerSocket1Listen(TObject *Sender,</p><p> TCustomWinSocket *Socket){ }</p><p> 通過(guò)在大括號(hào)內(nèi)編寫程序來(lái)實(shí)現(xiàn)偵聽(tīng)功能,代碼如下:</p><p> Memo1->Lines->Append("中心開(kāi)始偵聽(tīng)...");</p
76、><p> 在客戶端設(shè)置IP,當(dāng)客戶端與服務(wù)器成功連接上之后,雙方就可以開(kāi)始互相傳輸文件了。文件傳輸原理相同,這里介紹由客戶端向服務(wù)器傳輸文件。</p><p><b> 1、文件發(fā)送</b></p><p> 雙擊Button1控件,這里需要生成一個(gè)文件發(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)建一個(gè)文件發(fā)送線程,void __fastcall TSndFileThread::Execute(){ }</p><p> 在程序的開(kāi)頭段定義一些全局變量:</p><p> unsigned int iSndFileHandle;</p><p> AnsiString sndFileName;</p><p> AnsiSt
79、ring sndFileName0;</p><p> unsigned int iSndFileLength;</p><p> 首先,打開(kāi)文件需要一個(gè)對(duì)話框,才能選定要發(fā)送的文件。這里用到OpenDialog1控件,代碼如下:</p><p> if (Form1->OpenDialog1->Execute()){ }</p>
80、<p> 也就是說(shuō)如果OpenDialog1存在的話,那么接著執(zhí)行下面的工作,在大括號(hào)里添加代碼如下:</p><p> Form1->Memo1->Lines->Append("\n\n=========================\n");</p><p> sndFileName=Form1->OpenDialog1-&
81、gt;FileName;</p><p> 文件打開(kāi)成功后,先獲得其總長(zhǎng)度并添加到Memo1中,代碼如下:</p><p> iSndFileLength = FileSeek(iSndFileHandle,0,2); //獲得文件長(zhǎng)度</p><p> Form1->Memo1->Lines->Append("發(fā)送的文件
82、長(zhǎng)度為:"+AnsiString (iSndFileLength));</p><p> 定義發(fā)送文件名的長(zhǎng)度byte fileNameLen;用函數(shù)Length()計(jì)算出其長(zhǎng)度,接著定義一個(gè)數(shù)組計(jì)算文件內(nèi)容的長(zhǎng)度,代碼如下:</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> 每次傳送文件的長(zhǎng)度定義為4096個(gè)字節(jié)byte bTmpDataBuf[4096];每次傳送文件長(zhǎng)度將會(huì)顯示傳送字節(jié)、下一個(gè)傳送的指針地址、文件總長(zhǎng)度,代碼如下:</p><p> sndTmpPtr+=sndLen;</p><p> iSndFilePtr+=sndTmpPtr;</p>
86、<p> Form1->Memo1->Lines->Append("傳送文件長(zhǎng)度為:"+AnsiString(sndTmpPtr)</p><p> +"/"+AnsiString(iSndFilePtr)+"/"+AnsiString(iSndFileLength));</p><p> 最后
87、關(guān)閉文件FileClose(iSndFileHandle);</p><p> 當(dāng)傳送文件結(jié)束時(shí),在Memo1上顯示如下內(nèi)容:</p><p> Form1->Memo1->Lines->Append("文件"+sndFileName0+"已經(jīng)發(fā)送完成!");</p><p> Form1->Me
88、mo1->Lines->Append("傳送文件結(jié)束,長(zhǎng)度為:"+AnsiString (iSndFilePtr));</p><p> 設(shè)置按鍵1有效Form1->Button1->Enabled=true;</p><p> 到此,文件傳送結(jié)束。</p><p><b> 2、文件接收</b>
89、;</p><p> 服務(wù)器打開(kāi)偵聽(tīng)與客戶端連接上之后,在Memo1和StatusBar1上顯示已經(jīng)被“...”連接上,同時(shí)按鍵3有效,按鍵1的Caption為斷開(kāi)連接,代碼如下:</p><p> Memo1->Lines->Append("已經(jīng)被"+Socket->RemoteAddress+":"+AnsiString (
90、Socket->RemotePort)+"連接上");</p><p> Button3->Enabled=true;</p><p> Button1->Caption="斷開(kāi)連接";</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)處雙擊,代碼窗口中會(huì)自動(dòng)生成一個(gè)該
92、控件的基本程序框架。</p><p> void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,</p><p> TCustomWinSocket *Socket){ }</p><p> 文件接收的代碼編寫都在大括號(hào)里。</p><p> 首先接收頭文件的
93、長(zhǎng)度,并在Memo1中顯示,如下:</p><p> int ReceiveLen=Socket->ReceiveLength();</p><p> Memo1->Lines->Append("首次接收字節(jié)數(shù):"+AnsiString(k)+"/"+AnsiString (ReceiveLen));</p>&l
94、t;p> 再計(jì)算出接收文件的總長(zhǎng)度,并在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("將接收的文件長(zhǎng)度為:"+AnsiString (iRcvFileLength));</p><p> 由于發(fā)送的時(shí)候是按每次4096個(gè)字節(jié)來(lái)發(fā)送的,所以對(duì)應(yīng)于接收文件的長(zhǎng)度也是按每次4096個(gè)字節(jié)來(lái)接收的,代碼如下:</p><p> iRcvFilePtr+=ReceiveLen;</p><p>
97、 Memo1->Lines->Append("本次接收文件長(zhǎng)度為:"+AnsiString(ReceiveLen)</p><p> +"/"+AnsiString(iRcvFilePtr)+"/"+AnsiString(iRcvFileLength));</p><p> 如果接收文件的指針>=接收文件的
98、總長(zhǎng)度,則表明接收文件成功,在Memo1中顯示,并彈出一個(gè)提示框,代碼如下:</p><p> if(iRcvFilePtr>=iRcvFileLength)</p><p><b> {</b></p><p> fclose(RcvFp);</p><p> iRcvFilePtr=-1; //開(kāi)
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、軟件運(yùn)行與結(jié)果</p><p><b> 5.1 運(yùn)行情況</b></p><p> 1、軟件設(shè)計(jì)完成之后,將其保存在指定的路徑之下,設(shè)置保存目錄為“E:\文件傳輸\”。</p><p> 2、單擊加速條上的運(yùn)行按鈕,或按F9運(yùn)行程序,結(jié)果如圖5-1。在客戶端界面單擊右鍵設(shè)置中心IP地址為127.0.0.1,如圖5-2。</p>
102、;<p> 3、設(shè)置好IP后,單擊服務(wù)器端的“等待接連”按鈕,打開(kāi)偵聽(tīng),如圖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ù)器打開(kāi)偵聽(tīng)</p><p> (a) 客戶端 (b) 服務(wù)器端</p><p> 圖5-4 服務(wù)器與客戶端成功連接</p
104、><p> 4、成功連接之后,兩端就可以互相發(fā)送文件了。單擊“向中心發(fā)送文件”按鈕,在彈出的對(duì)話框內(nèi)選擇要發(fā)送的文件,如圖5-5,打開(kāi)選中的文件之后就開(kāi)始傳送文件,傳送成功后在客戶端的Memo1中顯示文件傳送的信息,在服務(wù)器端的Memo1中顯示文件接收的信息,并在服務(wù)器端彈出一個(gè)提示框,如圖5-6。</p><p> 圖5-5 打開(kāi)文件對(duì)話框</p><p>
105、圖5-6 文件發(fā)送成功</p><p> 5、發(fā)送結(jié)束后,點(diǎn)擊OK,關(guān)閉提示框,然后點(diǎn)界面右上角的叉,退出程序。</p><p> 5.2 有待開(kāi)發(fā)的地方</p><p> 經(jīng)過(guò)測(cè)試,在本程序的基礎(chǔ)上還可以做出如下改進(jìn):</p><p> 1、一對(duì)多發(fā)送文件。目前發(fā)送文件需要設(shè)置IP,只能點(diǎn)對(duì)點(diǎn)傳輸,如果要發(fā)送至多人就需要重新設(shè)置I
106、P,比較麻煩。</p><p> 2、選擇保存地址。文件接收到后可以選擇其保存地址,而不是在安裝這個(gè)軟件的目錄下。</p><p> 3、文件傳輸服務(wù)器安全問(wèn)題。可以對(duì)傳輸文件進(jìn)行加密或加入用戶安全認(rèn)證系統(tǒng)。</p><p> 4、進(jìn)一步美化軟件界面。</p><p><b> 6 結(jié) 論</b></p&
107、gt;<p> 本文按照任務(wù)書的要求,首先通過(guò)閱讀相關(guān)資料了解TCP/IP協(xié)議,熟悉C++ Builder開(kāi)發(fā)環(huán)境。在了解了C++ Builder的內(nèi)容以及熟悉面向?qū)ο笙嚓P(guān)技術(shù)之后,又進(jìn)一步的了解TCP Socket有關(guān)的API函數(shù)及其編程。在熟悉了一系列的相關(guān)知識(shí)之后,開(kāi)始制訂文件實(shí)時(shí)發(fā)送設(shè)計(jì)方案。Internet網(wǎng)絡(luò)技術(shù)發(fā)展迅速,特別是基于網(wǎng)絡(luò)的應(yīng)用服務(wù),已延伸到人們生活中不可缺少的一部分。所以網(wǎng)絡(luò)實(shí)時(shí)文件傳輸軟件的
108、設(shè)計(jì)對(duì)于簡(jiǎn)單的傳輸文件還是挺有幫助的。</p><p> 該軟件所實(shí)現(xiàn)的功能很簡(jiǎn)單,只是點(diǎn)對(duì)點(diǎn)文件的發(fā)送與接收。盡管如此,在編寫程序的過(guò)程中還是碰到了許多的困難。比如,剛接觸到線程這個(gè)概念的時(shí)候,還不是很能理解它的作用,對(duì)于如何創(chuàng)建一個(gè)與程序相關(guān)的發(fā)送文件線程,然后用一個(gè)主線程去調(diào)用創(chuàng)建的文件發(fā)送線程也不是很明白。程序中文件的發(fā)送是要先計(jì)算出文件的長(zhǎng)度,然后每次發(fā)送都是按照固定字節(jié)發(fā)送的,相對(duì)應(yīng)于接收也是分字節(jié)
109、接收的。對(duì)于這個(gè)分段發(fā)送文件也困擾了我好久。還有就是最后接收的文件不能對(duì)其先重命名然后選擇其保存地址,只能保存在安裝這個(gè)軟件的目錄下,目前這個(gè)功能還沒(méi)有實(shí)現(xiàn)。</p><p> 這些待解決的問(wèn)題是本次設(shè)計(jì)中的不足之處,在日后會(huì)盡力去解決。</p><p><b> 參考文獻(xiàn)</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] 楊延雙,張建標(biāo),王全民. TCP/IP協(xié)議分析及應(yīng)用[M]. 北京:機(jī)械工業(yè)出版社, 200
112、7,2.</p><p> [6] 汪曉平,鐘軍. Visual C++網(wǎng)絡(luò)通信協(xié)議分析與應(yīng)用實(shí)現(xiàn)[M]. 北京:人民郵電出版社, 2003,2.</p><p> [7] 趙強(qiáng). 基于FTP協(xié)議的文件傳輸服務(wù)器的研究[D]. 大連:大連海事大學(xué), 2008.</p><p> [8] 馬永琴,李正文,汪劉艷. 基于WinSock的文件互傳[J]. 重慶大學(xué)學(xué)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)實(shí)時(shí)文件傳輸軟件的開(kāi)發(fā)【開(kāi)題報(bào)告】
- 畢業(yè)論文范文——java文件傳輸
- 畢業(yè)論文——基于android的ftp文件傳輸
- 畢業(yè)論文——基于android的ftp文件傳輸
- 畢業(yè)論文——基于android的ftp文件傳輸
- 多線程網(wǎng)絡(luò)文件傳輸系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- XMPP協(xié)議兼容的即時(shí)文件傳輸策略.pdf
- 基于socket技術(shù)的windows mobile設(shè)備間的文件傳輸工具開(kāi)發(fā)【畢業(yè)論文】
- 網(wǎng)絡(luò)文件傳輸機(jī)制探析
- 網(wǎng)絡(luò)文件傳輸技術(shù)【文獻(xiàn)綜述】
- 畢業(yè)論文---基于局域網(wǎng)的文件傳輸系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- java文件傳輸(論文+源代碼)
- rtp--實(shí)時(shí)軟件傳輸協(xié)議畢業(yè)論文外文翻譯
- 計(jì)算機(jī)科學(xué)與技術(shù)畢業(yè)論文-基于android的ftp文件傳輸
- 深空網(wǎng)絡(luò)文件傳輸協(xié)議研究.pdf
- 基于android的ftp文件傳輸
- 基于android的ftp文件傳輸
- 軟件開(kāi)發(fā)畢業(yè)論文-畢業(yè)論文
- asp.net多功能聊天軟件的設(shè)計(jì)與開(kāi)發(fā)——文字聊天文件傳輸模塊(源代碼+論文)
- asp.net多功能聊天軟件的設(shè)計(jì)與開(kāi)發(fā)——文字聊天文件傳輸模塊(源代碼+論文)
評(píng)論
0/150
提交評(píng)論