版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
哈爾濱工業(yè)大學(xué)課程結(jié)業(yè)報(bào)告陳琳姓名:陳琳09S003158學(xué)號:09S003158計(jì)算機(jī)科學(xué)與技術(shù)所學(xué)專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)網(wǎng)絡(luò)程序設(shè)計(jì)課程名稱:網(wǎng)絡(luò)程序設(shè)計(jì)2023-12-20提交日期:2023-12-20目錄1.基于TCP/IP及UDP的通信傳輸概述22.系統(tǒng)體系結(jié)構(gòu)………………………32.1面向TCP連接系統(tǒng)調(diào)用過程42.2面向UDP連接系統(tǒng)調(diào)用過程53.系統(tǒng)要求與功能實(shí)現(xiàn)53.1公共類設(shè)計(jì)53.1.1IP地址操作類53.1.2DNS相關(guān)類63.2TCP文件傳輸73.2.1效勞器端73.2.2客戶端83.3UDP文件傳輸93.3.1效勞器端103.3.2客戶端113.4線程池113.5其它124.試驗(yàn)結(jié)果125.思考146.結(jié)論和收獲15基于socket套接字的文件傳輸軟件的設(shè)計(jì)與實(shí)現(xiàn)概述TCP/IP〔TransmissionControlProtocol/InternetProtocol)的簡寫,中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是Internet最根本的協(xié)議、Internet國際互聯(lián)網(wǎng)絡(luò)的根底,簡單地說,就是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。TCP/IP協(xié)議使用范圍極廣,是目前異種網(wǎng)絡(luò)通信使用的唯一協(xié)議體系,適用于連接多種機(jī)型,既可用于局域網(wǎng),又可用于廣域網(wǎng),許多廠商的計(jì)算機(jī)操作系統(tǒng)和網(wǎng)絡(luò)操作系統(tǒng)產(chǎn)品都采用或含有TCP/IP協(xié)議。TCP/IP協(xié)議已成為目前事實(shí)上的國際標(biāo)準(zhǔn)和工業(yè)標(biāo)準(zhǔn)?;赥CP/IP協(xié)議組的網(wǎng)絡(luò)模型分為應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層和物理層這樣五個(gè)層次。TCP/IP協(xié)議組位于應(yīng)用程序和硬件之間,指揮數(shù)據(jù)在網(wǎng)絡(luò)各層中傳遞。其中傳輸層的協(xié)議包括傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)報(bào)協(xié)議(UDP),它們都建立在IP協(xié)議的根底上,其中TCP提供可靠的面向連接效勞,UDP提供簡單的無連接效勞。傳輸層提供端到端,即應(yīng)用程序之間的通信,主要功能是數(shù)據(jù)格式化、數(shù)據(jù)確認(rèn)和喪失重傳等。TCP協(xié)議是面向連接的協(xié)議,它提供可靠的字節(jié)流效勞,在進(jìn)行數(shù)據(jù)傳輸之前必須先建立連接,經(jīng)三次握手確定后才開始數(shù)據(jù)傳送。UDP進(jìn)行數(shù)據(jù)報(bào)傳輸使用的是不可靠、無連接的協(xié)議。網(wǎng)絡(luò)層包括互連網(wǎng)協(xié)議IP,互連網(wǎng)控制報(bào)文協(xié)議ICMP和互連網(wǎng)組管理協(xié)議IGMP。其中IP協(xié)議完成大局部的工作,負(fù)責(zé)數(shù)據(jù)傳輸和路由的選擇等。IP報(bào)頭中的地址和網(wǎng)卡相聯(lián)系(具體還涉及地址解析和反向地址解析協(xié)議),TCP、UDP報(bào)頭中的端口號側(cè)對應(yīng)著網(wǎng)絡(luò)主機(jī)上不同的程序。TCP/IP體系結(jié)構(gòu)如圖一所示:圖一TCP/IP體系結(jié)構(gòu)Socket通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄。應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。盡管TCP/IP協(xié)議的名稱中只有TCP這個(gè)協(xié)議名,但是在TCP/IP的傳輸層同時(shí)存在TCP和UDP兩個(gè)協(xié)議。TCP是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過TCP協(xié)議傳輸,得到的是一個(gè)順序的無過失的數(shù)據(jù)流。發(fā)送方和接收方的成對的兩個(gè)socket之間必須建立連接,以便在TCP協(xié)議的根底上進(jìn)行通信,當(dāng)一個(gè)socket〔通常都是serversocket〕等待建立連接時(shí),另一個(gè)socket可以要求進(jìn)行連接,一旦這兩個(gè)socket連接起來,它們就可以進(jìn)行雙向數(shù)據(jù)傳輸,雙方都可以進(jìn)行發(fā)送或接收操作。UDP是一種無連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。本文在Scoket原理根底上,基于.NET平臺,利用線程池技術(shù),設(shè)計(jì)并實(shí)現(xiàn)了分別面向TCP和UDP的可靠文件傳輸軟件。系統(tǒng)體系結(jié)構(gòu)根據(jù)采用的協(xié)議不同,本軟件分為基于TCP文件傳輸和基于UDP的可靠文件傳輸。在TCP/IP網(wǎng)絡(luò)中兩個(gè)進(jìn)程間的相互作用的主機(jī)模式是C/S。在操作過程中采取的是主動(dòng)請示方式:
首先效勞器方要先啟動(dòng),并根據(jù)請示提供相應(yīng)效勞:1、翻開一通信通道并告知本地主機(jī),它在某一個(gè)公認(rèn)地址上接收客戶請求;2、等待客戶請求到達(dá)該端口;3、接收到重復(fù)效勞請求,處理該請求并發(fā)送應(yīng)答信號;4、返回第2步,等待另一客戶請求;5、關(guān)閉效勞器??蛻舳耍?、翻開一通信通道,并連接到效勞器所在主機(jī)的特定端口;2、向效勞器發(fā)送效勞請求報(bào)文,等待并接收應(yīng)答;繼續(xù)提出請求……3、請求結(jié)束后關(guān)閉通信通道并終止。2.1面向TCP系統(tǒng)調(diào)用時(shí)序圖圖二面向TCP的系統(tǒng)時(shí)序圖2.2面向UDP系統(tǒng)調(diào)用時(shí)序圖圖三面向UDP的系統(tǒng)時(shí)序圖3.功能實(shí)現(xiàn)3.1公共類設(shè)計(jì)軟件設(shè)計(jì)時(shí),TCP和UDP的效勞器端為統(tǒng)一界面,客戶端為統(tǒng)一界面。即效勞器端既能夠接受TCP連接,也能通過UDP進(jìn)行接收;客戶端可以通過TCP和UDP進(jìn)行傳輸。3.1.1IP地址操作類1、IPAddress類在該類中有一個(gè)Parse()方法,可以把點(diǎn)分的十進(jìn)制IP表示轉(zhuǎn)化IPAddress類,方法如下:
IPAddressaddress=IPAddress.Parse(“9〞);IPAddress提供4個(gè)只讀字段
Any用于代表本地系統(tǒng)可用的任何IP地址Broadcase用于代表本地網(wǎng)絡(luò)的IP播送地址Loopback用于代表系統(tǒng)的回送地址None用于代表系統(tǒng)上沒有網(wǎng)絡(luò)接口其中IPAddress.Any最常用可以用來表示本機(jī)上所有的IP地址,這對于socket效勞進(jìn)行偵聽時(shí)便使用,不用對每個(gè)IP進(jìn)行偵聽了。2、IPEndPoint類通過二種構(gòu)造方法來創(chuàng)立IPEndPoint類:
a、IPEndPoint(longaddress,intport)
b、IPEndPoint(IPAddressaddress,intport)
它有四個(gè)屬性:
AddressAddressFamilyPortMaxPortMinPortIPEndPoint是一個(gè)IP地址和端口的綁定,可以代表一個(gè)效勞,用來Socket通訊。DNS相關(guān)類DNS類有四個(gè)靜態(tài)方法,來獲取主機(jī)DNS相關(guān)信息:1、GetHostName()通過Dns.GetHostName()可以獲得本地計(jì)算機(jī)的主機(jī)名2、GetHostByName()根據(jù)主機(jī)名稱,返回一個(gè)IPHostEntry對象:IPHostEntryGetHostByName(stringhostName)。其中IPHostEntry把一個(gè)DNS主機(jī)名與一個(gè)別名和IP地址的數(shù)組相關(guān)聯(lián),包含三個(gè)屬性:AddressList:一個(gè)IPAddress對象的數(shù)組Aliases:一個(gè)字符串對象數(shù)組HostName:一個(gè)用于主機(jī)名的字符串對象3、GetHostByAddress()類似于GetHostByName(),只不過這里的參數(shù)是IP地址,而不是主機(jī)名,也返回一個(gè)IPHostEntry對象。IPHostEntryGetHostByAddress(IPAddressaddress)IPHostEntryGetHostByAddress(stringaddress)
4、Resolve()
當(dāng)不知道輸入的遠(yuǎn)程主機(jī)的地址是哪種格式時(shí)〔主機(jī)名或IP地址〕,用以上的二種方法來實(shí)現(xiàn),可能還要通過判斷客戶輸入的格式,才能正確使用,但Dns類提供一更簡單的方法Resolve(),該方法可以接受或者是主機(jī)名格式或者是IP地址格式的任何一種地址,并返回IPHostEntry對象。3.2TCP文件傳輸3.2.1效勞器端1、創(chuàng)立IPEndPoint實(shí)例,用于Socket偵聽時(shí)綁定:IPEndPointipep=newIPEndPoint(IPAddress.Any,7000);2、創(chuàng)立套接字實(shí)例:serverSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);這里創(chuàng)立的時(shí)候用ProtocolType.Tcp,表示建立一個(gè)面向連接(TCP)的Socket。3、將所創(chuàng)立的套接字與IPEndPoint綁定:serverSocket.Bind(ipep)。4、設(shè)置套接字為收聽模式:serverSocket.Listen(10)。5、在套接字上接收接入的連接在此使用.net的線程池類,默認(rèn)情況下創(chuàng)立25個(gè)線程。從線城池中獲取一個(gè)線程來處理客戶端請求。ThreadPool.QueueUserWorkItem。6、在套接字上接受客戶端發(fā)送的信息局部代碼:BinaryReaderreader=newBinaryReader(client.GetStream());stringfilename=reader.ReadString();longtotal=reader.ReadInt64();stringsaveAs=GetSaveFile(filename);FileStreamfs=File.Create(saveAs);try{byte[]buffer=newbyte[8192];intlen;while(total>0){len=reader.Read(buffer,0,8192);if(len==0)thrownewIOException("發(fā)送方中止了連接");fs.Write(buffer,0,len);}}3.2.2客戶端1、創(chuàng)立IPEndPoint實(shí)例和套接字;2、將套接字連接到遠(yuǎn)程效勞器;clientSocket.Connect(ipep)3、發(fā)送信息FileInfofi=newFileInfo(textBox1.Text);writer.Write(fi.Name);writer.Write(fi.Length);FileStreamfs=fi.OpenRead();longtotal=fi.Length;byte[]buffer=newbyte[8192];intlen;while((len=fs.Read(buffer,0,8192))!=0){writer.Write(buffer,0,len);}客戶端使用openFileDialog類選擇文件,然后向效勞器端傳送文件長度和文件名,最后將需要傳送的文件切割成以單位為8k的數(shù)據(jù)塊進(jìn)行傳送。效勞器端使用SaveFileDialog類選擇存儲文件的位置,然后接受客戶端發(fā)送的文件名和文件長度,然后進(jìn)行小數(shù)據(jù)塊接受,使用循環(huán),直至客戶端發(fā)送完畢,效勞器端在接受客戶端連接請求時(shí)開辟了一個(gè)內(nèi)存池。面向連接的程序流程圖如下所示:圖四面向TCP的程序流程圖3.3UDP文件傳輸TCP是面向連接的,所以用TCP傳輸文件不會丟包。UDP是非面向連接的,所以UDP是不可靠的,用它傳輸文件,要保證不丟包,就需要額外代碼來保障。本文采用的是在接受文件端來檢測,當(dāng)開始接收文件,收到一個(gè)數(shù)據(jù)包后,如果等待超過了一定時(shí)間后都沒有收到數(shù)據(jù)包,就給發(fā)送方發(fā)送一個(gè)新的請求,要求繼續(xù)發(fā)送文件,直到文件全部接收完成。流程圖如下:圖五UDP傳輸流程3.3.1效勞器端在UDP效勞器端設(shè)計(jì)過程中,局部步驟和實(shí)現(xiàn)代碼與TCP相似,在此不再贅述。根本的實(shí)現(xiàn)步驟:1、創(chuàng)立一個(gè)socket,用函數(shù)socket();2、綁定IP地址、端口等信息到socket上,用函數(shù)bind();3、循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom();4、關(guān)閉網(wǎng)絡(luò)連接;為了實(shí)現(xiàn)UDP的可靠傳輸,設(shè)計(jì)了ReceiveFileManager類,如下列圖所示:圖六ReceiveFileManager類可靠傳輸?shù)木唧w做法是:1、在ReceiveFileManager類中參加一個(gè)記錄文件分塊接收狀態(tài)的列表Dictionary<int,bool>,int表示文件分塊的序號,bool表示是否已經(jīng)接收,初始化為全部沒有接受〔false〕。2、在ReceiveFileManager類中參加一個(gè)Timer,用來檢測收到一個(gè)包后等待的時(shí)間是否超過了設(shè)置的值,超過就給發(fā)送方發(fā)送數(shù)據(jù)包,請求繼續(xù)發(fā)送文件,需要發(fā)送的文件塊序號為從Dictionary<int,bool>中查詢出來的沒有接收的文件塊序號。3、如果Dictionary<int,bool>中的所有文件塊已經(jīng)收到〔全部為true〕,文件就接收完成了。3.3.2客戶端在UDP客戶端設(shè)計(jì)過程中,局部步驟和實(shí)現(xiàn)代碼與TCP相似,在此不再贅述。根本的實(shí)現(xiàn)步驟:1、創(chuàng)立一個(gè)socket,用函數(shù)socket();
2、綁定IP地址、端口等信息到socket上,用函數(shù)bind();3、設(shè)置對方的IP地址和端口等屬性;
4、發(fā)送數(shù)據(jù),用函數(shù)sendto();
5、關(guān)閉網(wǎng)絡(luò)連接;為了保證UDP的可靠傳輸,客戶端也需要對效勞器端某個(gè)端口的發(fā)送來的信息進(jìn)行監(jiān)控,一旦效勞器請求,那么進(jìn)行重傳。IPEndPointremoteIP=newIPEndPoint(IPAddress.Any,0);byte[]buffer=null;try{buffer=UdpClient.EndReceive(result,refremoteIP);}catch(SocketExceptionex){throwex;}finally{ReceiveInternal();}OnReceiveData(newReceiveDataEventArgs(buffer,remoteIP));3.4線程池通過System.Threading名稱空間的ThreadPool類來使用線程池,它所有的成員都是靜態(tài)的,而且沒有公開的構(gòu)造函數(shù)。這個(gè)限制的目的是為了把所有的異步編程技術(shù)都集中到同一個(gè)池中。假設(shè)構(gòu)造了含有兩個(gè)線程的線程池,當(dāng)三個(gè)請求到達(dá)時(shí),它們立刻安排到隊(duì)列等待被處理,因?yàn)閮蓚€(gè)線程都是空閑的,所以頭兩個(gè)請求開始執(zhí)行。當(dāng)其中任何一個(gè)請求處理結(jié)束后,空閑的線程就會去提取第三個(gè)請求并處理
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專用設(shè)備的結(jié)構(gòu)強(qiáng)度分析考核試卷
- 2025-2030全球汽車引擎蓋和后備箱釋放電纜行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國受控環(huán)境室和房間行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國自主挖掘機(jī)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 自然美術(shù)課程設(shè)計(jì)
- 認(rèn)識地圖課程設(shè)計(jì)
- 老路改造課程設(shè)計(jì)
- 粘土三明治課程設(shè)計(jì)
- 課程設(shè)計(jì)等高線的確定
- 領(lǐng)導(dǎo)能力提升課程設(shè)計(jì)
- 2024年醫(yī)師定期考核臨床業(yè)務(wù)知識考試題庫及答案(共三套)
- 2014新PEP小學(xué)英語六年級上冊-Unit5-What-does-he-do復(fù)習(xí)課件
- 建筑材料供應(yīng)鏈管理服務(wù)合同
- 孩子改名字父母一方委托書
- 2024-2025學(xué)年人教版初中物理九年級全一冊《電與磁》單元測試卷(原卷版)
- 江蘇單招英語考綱詞匯
- 2024年事業(yè)單位財(cái)務(wù)工作計(jì)劃例文(6篇)
- 2024年工程咨詢服務(wù)承諾書
- 青桔單車保險(xiǎn)合同條例
- 車輛使用不過戶免責(zé)協(xié)議書范文范本
- 2023-2024學(xué)年天津市部分區(qū)九年級(上)期末物理試卷
評論
0/150
提交評論