




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、哈爾濱工業(yè)大學(xué)課程結(jié)業(yè)報(bào)告陳 琳姓 名:09S003158學(xué) 號(hào):計(jì)算機(jī)科學(xué)與技術(shù)所學(xué)專業(yè):網(wǎng)絡(luò)程序設(shè)計(jì)課程名稱:2009-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.1 IP地址操作類53.1.2 DNS相關(guān)類63.2 TCP文件傳輸73.2.1 服務(wù)器端73.2.2 客戶端83.3 UDP文件傳輸93.3.1 服務(wù)器端103.3.2 客戶端113.4線程池113.5其它124.試驗(yàn)結(jié)果125思考146結(jié)論和收獲15基于socket
2、套接字的文件傳輸軟件的設(shè)計(jì)與實(shí)現(xiàn)1. 概述TCP/IP(Transmission Control Protocol/Internet Protocol)的簡(jiǎn)寫,中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是Internet最基本的協(xié)議、Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),簡(jiǎn)單地說,就是由網(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í)上的國(guó)際標(biāo)準(zhǔn)和工業(yè)標(biāo)準(zhǔn)。
3、基于TCP/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é)議的基礎(chǔ)上,其中TCP提供可靠的面向連接服務(wù),UDP提供簡(jiǎn)單的無連接服務(wù)。傳輸層提供端到端,即應(yīng)用程序之間的通信,主要功能是數(shù)據(jù)格式化、數(shù)據(jù)確認(rèn)和丟失重傳等。TCP協(xié)議是面向連接的協(xié)議,它提供可靠的字節(jié)流服務(wù),在進(jìn)行數(shù)據(jù)傳輸之前必須先建立連接,經(jīng)三次握手確定后才開始數(shù)據(jù)傳送。UDP進(jìn)行數(shù)據(jù)報(bào)傳輸使用的是不可靠、無連接的協(xié)議。網(wǎng)絡(luò)層包括互連網(wǎng)協(xié)議 IP,
4、互連網(wǎng)控制報(bào)文協(xié)議 ICMP和互連網(wǎng)組管理協(xié)議IGMP。其中IP協(xié)議完成大部分的工作,負(fù)責(zé)數(shù)據(jù)傳輸和路由的選擇等。I P報(bào)頭中的地址和網(wǎng)卡相聯(lián)系( 具體還涉及地址解析和反向地址解析協(xié)議),TCP 、UDP報(bào)頭中的端口號(hào)側(cè)對(duì)應(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ā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)
5、絡(luò)上的應(yīng)用程序。盡管TCP/IP協(xié)議的名稱中只有TCP這個(gè)協(xié)議名,但是在TCP/IP的傳輸層同時(shí)存在TCP和UDP兩個(gè)協(xié)議。TCP是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過TCP協(xié)議傳輸,得到的是一個(gè)順序的無差錯(cuò)的數(shù)據(jù)流。發(fā)送方和接收方的成對(duì)的兩個(gè)socket之間必須建立連接,以便在TCP協(xié)議的基礎(chǔ)上進(jìn)行通信,當(dāng)一個(gè)socket(通常都是server socket)等待建立連接時(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ò)
6、上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。 本文在Scoket原理基礎(chǔ)上,基于.NET平臺(tái),利用線程池技術(shù),設(shè)計(jì)并實(shí)現(xiàn)了分別面向TCP和UDP的可靠文件傳輸軟件。2. 系統(tǒng)體系結(jié)構(gòu)根據(jù)采用的協(xié)議不同,本軟件分為基于TCP文件傳輸和基于UDP的可靠文件傳輸。在TCP/IP網(wǎng)絡(luò)中兩個(gè)進(jìn)程間的相互作用的主機(jī)模式是C/S。在操作過程中采取的是主動(dòng)請(qǐng)示方式: 首先服務(wù)器方要先啟動(dòng),并根據(jù)請(qǐng)示提供相應(yīng)服務(wù): 1、打開一通信通道并告知本地主機(jī),它在某一個(gè)公認(rèn)地址上接收客戶請(qǐng)求; 2、等待客戶請(qǐng)求到達(dá)該端口;3、接收到重復(fù)服務(wù)請(qǐng)求,處理該請(qǐng)求并發(fā)送應(yīng)答
7、信號(hào);4、返回第2步,等待另一客戶請(qǐng)求;5、關(guān)閉服務(wù)器??蛻舳耍?、打開一通信通道,并連接到服務(wù)器所在主機(jī)的特定端口;2、向服務(wù)器發(fā)送服務(wù)請(qǐng)求報(bào)文,等待并接收應(yīng)答;繼續(xù)提出請(qǐng)求3、請(qǐng)求結(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的服務(wù)器端為統(tǒng)一界面,客戶端為統(tǒng)一界面。即服務(wù)器端既能夠接受TCP連接,也能通過UDP進(jìn)行接收;客戶端可以通過TCP和UDP進(jìn)行傳輸。3.1.1 IP地址操作類1、IPAddress類在該類中有一個(gè) Pars
8、e()方法,可以把點(diǎn)分的十進(jìn)制IP表示轉(zhuǎn)化IPAddress類,方法如下: IPAddress address = IPAddress.Parse(“9”); IPAddress提供4個(gè)只讀字段 Any 用于代表本地系統(tǒng)可用的任何IP地址 Broadcase 用于代表
9、本地網(wǎng)絡(luò)的IP廣播地址 Loopback 用于代表系統(tǒng)的回送地址 None 用于代表系統(tǒng)上沒有網(wǎng)絡(luò)接口其中IPAddress.Any最常用可以用來表示本機(jī)上所有的IP地址,這對(duì)于socket服務(wù)進(jìn)行偵聽時(shí)便使用,不用對(duì)每個(gè)IP進(jìn)行偵聽了。2、IPEndPoint類通過二種構(gòu)造方法來創(chuàng)建IPEndPoint類: a、IPEndPoint(long address, int port)
10、60; b、IPEndPoint(IPAddress address, int port) 它有四個(gè)屬性: Address AddressFamily Port MaxPort MinPortIPEndPoint是一個(gè)IP地址和端口的綁定,可以代表一個(gè)服務(wù),用來S
11、ocket通訊。3.1.2 DNS相關(guān)類DNS類有四個(gè)靜態(tài)方法,來獲取主機(jī)DNS相關(guān)信息:1、GetHostName() 通過Dns.GetHostName()可以獲得本地計(jì)算機(jī)的主機(jī)名2、GetHostByName()根據(jù)主機(jī)名稱,返回一個(gè)IPHostEntry 對(duì)象:IPHostEntry GetHostByName(string hostName)。其中IPHostEntry把一個(gè)DNS主機(jī)名與一個(gè)別名和IP地址的數(shù)組相關(guān)聯(lián),包含三個(gè)屬性: AddressList:一個(gè)IPAddress對(duì)象的數(shù)組
12、0; Aliases:一個(gè)字符串對(duì)象數(shù)組 HostName:一個(gè)用于主機(jī)名的字符串對(duì)象3、GetHostByAddress()類似于GetHostByName(),只不過這里的參數(shù)是IP地址,而不是主機(jī)名,也返回一個(gè)IPHostEntry對(duì)象。IPHostEntry GetHostByAddress(IPAddress address)IPHostEntry GetHostByAddress(string address)4、Resolve() 當(dāng)不知道輸入的遠(yuǎn)程主機(jī)的
13、地址是哪種格式時(shí)(主機(jī)名或IP地址),用以上的二種方法來實(shí)現(xiàn),可能還要通過判斷客戶輸入的格式,才能正確使用,但Dns類提供一更簡(jiǎn)單的方法Resolve(),該方法可以接受或者是主機(jī)名格式或者是IP地址格式的任何一種地址,并返回IPHostEntry對(duì)象。3.2 TCP文件傳輸3.2.1 服務(wù)器端1、創(chuàng)建IPEndPoint實(shí)例,用于Socket偵聽時(shí)綁定:IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 7000);2、創(chuàng)建套接字實(shí)例:serverSocket = new
14、0;Socket(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è)線程來處理客戶端請(qǐng)求。ThreadPool.Queue
15、UserWorkItem。6、在套接字上接受客戶端發(fā)送的信息部分代碼:BinaryReader reader = new BinaryReader(client.GetStream(); string filename = reader.ReadString(); long total = reader.ReadInt64(); string saveAs = GetSaveFile(filename); FileStream fs = File.Create(saveAs); try byte buffer = new byte8192; int len; while (total >
16、 0) len = reader.Read(buffer, 0, 8192); if (len = 0) throw new IOException("發(fā)送方中止了連接"); fs.Write(buffer, 0, len); 3.2.2 客戶端1、創(chuàng)建IPEndPoint實(shí)例和套接字;2、將套接字連接到遠(yuǎn)程服務(wù)器;clientSocket.Connect(ipep)3、發(fā)送信息FileInfo fi = new FileInfo(textBox1.Text); writer.Write(fi.Name); writer.Write(fi.Length); FileStre
17、am fs = fi.OpenRead();long total = fi.Length; byte buffer = new byte8192; int len; while (len = fs.Read(buffer, 0, 8192) != 0) writer.Write(buffer, 0, len); 客戶端使用openFileDialog類選擇文件,然后向服務(wù)器端傳送文件長(zhǎng)度和文件名,最后將需要傳送的文件切割成以單位為8k的數(shù)據(jù)塊進(jìn)行傳送。服務(wù)器端使用SaveFileDialog類選擇存儲(chǔ)文件的位置,然后接受客戶端發(fā)送的文件名和文件長(zhǎng)度,然后進(jìn)行小數(shù)據(jù)塊接受,使用循環(huán),直至客戶端發(fā)
18、送完畢,服務(wù)器端在接受客戶端連接請(qǐng)求時(shí)開辟了一個(gè)內(nèi)存池。面向連接的程序流程圖如下所示:圖四 面向TCP的程序流程圖3.3 UDP文件傳輸TCP是面向連接的,所以用TCP傳輸文件不會(huì)丟包。UDP是非面向連接的,所以UDP是不可靠的,用它傳輸文件,要保證不丟包,就需要額外代碼來保障。本文采用的是在接受文件端來檢測(cè),當(dāng)開始接收文件,收到一個(gè)數(shù)據(jù)包后,如果等待超過了一定時(shí)間后都沒有收到數(shù)據(jù)包,就給發(fā)送方發(fā)送一個(gè)新的請(qǐng)求,要求繼續(xù)發(fā)送文件,直到文件全部接收完成。流程圖如下:圖五 UDP傳輸流程3.3.1 服務(wù)器端在UDP服務(wù)器端設(shè)計(jì)過程中,部分步驟和實(shí)現(xiàn)代碼與TCP相似,在此不再贅述?;镜膶?shí)現(xiàn)步驟:1
19、、創(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表示文件分塊的序號(hào),bool表示是否已經(jīng)接收,初始化為全部沒有接受(false)。2、在ReceiveFileManager類中加
20、入一個(gè)Timer,用來檢測(cè)收到一個(gè)包后等待的時(shí)間是否超過了設(shè)置的值,超過就給發(fā)送方發(fā)送數(shù)據(jù)包,請(qǐng)求繼續(xù)發(fā)送文件,需要發(fā)送的文件塊序號(hào)為從Dictionary<int, bool>中查詢出來的沒有接收的文件塊序號(hào)。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è)置對(duì)方的IP地址和端口等屬
21、性;4、發(fā)送數(shù)據(jù),用函數(shù)sendto();5、關(guān)閉網(wǎng)絡(luò)連接;為了保證UDP的可靠傳輸,客戶端也需要對(duì)服務(wù)器端某個(gè)端口的發(fā)送來的信息進(jìn)行監(jiān)控,一旦服務(wù)器請(qǐng)求,則進(jìn)行重傳。 IPEndPoint remoteIP = new IPEndPoint(IPAddress.Any, 0); byte buffer = null; try buffer = UdpClient.EndReceive(result, ref remoteIP); catch (SocketException ex) throw ex; finally ReceiveInternal(); OnReceiveData(new ReceiveDataEventArgs(buffer, remoteIP);3.4線程池通過System.Threading 名稱空間的Thread Pool 類來使用線程池,它所有的成員都是靜態(tài)的,而且沒有公開的構(gòu)造函數(shù)。這個(gè)限制的目的是為了把所有的異步編程技術(shù)都集中到同一個(gè)池中。假如構(gòu)造了含有兩個(gè)線程的線程池,當(dāng)三個(gè)請(qǐng)求到達(dá)時(shí),它們立刻安排到隊(duì)列等待被
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河北電線電纜橋架施工方案
- 臨床護(hù)理不良事件案例分享
- 曲陽路面鵝卵石施工方案
- 上海日播至勝實(shí)業(yè)有限公司股權(quán)估值項(xiàng)目估值報(bào)告
- 北方古建筑屋頂施工方案
- 陜西節(jié)日彩燈設(shè)計(jì)施工方案
- 地面混凝土施工方案圖例
- 2025年乳味飲品項(xiàng)目發(fā)展計(jì)劃
- 公眾參與與環(huán)保意識(shí)的提升分析
- 低空經(jīng)濟(jì)公司技術(shù)開發(fā)與創(chuàng)新策略
- 安徽省江南十校2024屆高三3月聯(lián)考數(shù)學(xué)試卷 含解析
- 2025(人教版)數(shù)學(xué)一年級(jí)下冊(cè)全冊(cè)教學(xué)案
- 人教版 七年級(jí)英語下冊(cè) UNIT 1 單元綜合測(cè)試卷(2025年春)
- 2025年遼寧醫(yī)藥職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年常考版參考題庫(kù)含答案解析
- 《痛經(jīng)的預(yù)防保健》課件
- 幼兒園三會(huì)一課會(huì)議記錄
- 2025年宜賓興文縣招考聘用社區(qū)專職工作者7人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 公園物業(yè)管理安保服務(wù)投標(biāo)技術(shù)標(biāo)方案參考借鑒范本
- 《習(xí)近平法治思想概論(第二版)》 課件 3.第三章 習(xí)近平法治思想的實(shí)踐意義
- 中醫(yī)藥文化知識(shí)培訓(xùn)課件
- 2025中智集團(tuán)招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
評(píng)論
0/150
提交評(píng)論