基于socket的文件傳輸軟件的設計與實現_第1頁
基于socket的文件傳輸軟件的設計與實現_第2頁
基于socket的文件傳輸軟件的設計與實現_第3頁
基于socket的文件傳輸軟件的設計與實現_第4頁
基于socket的文件傳輸軟件的設計與實現_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

哈爾濱工業(yè)大學課程結業(yè)報告陳琳姓名:陳琳09S003158學號:09S003158計算機科學與技術所學專業(yè):計算機科學與技術網絡程序設計課程名稱:網絡程序設計2023-12-20提交日期:2023-12-20目錄1.基于TCP/IP及UDP的通信傳輸概述22.系統(tǒng)體系結構………………………32.1面向TCP連接系統(tǒng)調用過程42.2面向UDP連接系統(tǒng)調用過程53.系統(tǒng)要求與功能實現53.1公共類設計53.1.1IP地址操作類53.1.2DNS相關類63.2TCP文件傳輸73.2.1效勞器端73.2.2客戶端83.3UDP文件傳輸93.3.1效勞器端103.3.2客戶端113.4線程池113.5其它124.試驗結果125.思考146.結論和收獲15基于socket套接字的文件傳輸軟件的設計與實現概述TCP/IP〔TransmissionControlProtocol/InternetProtocol)的簡寫,中文譯名為傳輸控制協(xié)議/因特網互聯協(xié)議,又叫網絡通訊協(xié)議,這個協(xié)議是Internet最根本的協(xié)議、Internet國際互聯網絡的根底,簡單地說,就是由網絡層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。TCP/IP協(xié)議使用范圍極廣,是目前異種網絡通信使用的唯一協(xié)議體系,適用于連接多種機型,既可用于局域網,又可用于廣域網,許多廠商的計算機操作系統(tǒng)和網絡操作系統(tǒng)產品都采用或含有TCP/IP協(xié)議。TCP/IP協(xié)議已成為目前事實上的國際標準和工業(yè)標準?;赥CP/IP協(xié)議組的網絡模型分為應用層、傳輸層、網絡層、鏈路層和物理層這樣五個層次。TCP/IP協(xié)議組位于應用程序和硬件之間,指揮數據在網絡各層中傳遞。其中傳輸層的協(xié)議包括傳輸控制協(xié)議(TCP)和用戶數據報協(xié)議(UDP),它們都建立在IP協(xié)議的根底上,其中TCP提供可靠的面向連接效勞,UDP提供簡單的無連接效勞。傳輸層提供端到端,即應用程序之間的通信,主要功能是數據格式化、數據確認和喪失重傳等。TCP協(xié)議是面向連接的協(xié)議,它提供可靠的字節(jié)流效勞,在進行數據傳輸之前必須先建立連接,經三次握手確定后才開始數據傳送。UDP進行數據報傳輸使用的是不可靠、無連接的協(xié)議。網絡層包括互連網協(xié)議IP,互連網控制報文協(xié)議ICMP和互連網組管理協(xié)議IGMP。其中IP協(xié)議完成大局部的工作,負責數據傳輸和路由的選擇等。IP報頭中的地址和網卡相聯系(具體還涉及地址解析和反向地址解析協(xié)議),TCP、UDP報頭中的端口號側對應著網絡主機上不同的程序。TCP/IP體系結構如圖一所示:圖一TCP/IP體系結構Socket通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過"套接字"向網絡發(fā)出請求或者應答網絡請求。Socket接口是TCP/IP網絡的API,Socket接口定義了許多函數或例程,程序員可以用它們來開發(fā)TCP/IP網絡上的應用程序。盡管TCP/IP協(xié)議的名稱中只有TCP這個協(xié)議名,但是在TCP/IP的傳輸層同時存在TCP和UDP兩個協(xié)議。TCP是一種面向連接的保證可靠傳輸的協(xié)議。通過TCP協(xié)議傳輸,得到的是一個順序的無過失的數據流。發(fā)送方和接收方的成對的兩個socket之間必須建立連接,以便在TCP協(xié)議的根底上進行通信,當一個socket〔通常都是serversocket〕等待建立連接時,另一個socket可以要求進行連接,一旦這兩個socket連接起來,它們就可以進行雙向數據傳輸,雙方都可以進行發(fā)送或接收操作。UDP是一種無連接的協(xié)議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址,它在網絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的。本文在Scoket原理根底上,基于.NET平臺,利用線程池技術,設計并實現了分別面向TCP和UDP的可靠文件傳輸軟件。系統(tǒng)體系結構根據采用的協(xié)議不同,本軟件分為基于TCP文件傳輸和基于UDP的可靠文件傳輸。在TCP/IP網絡中兩個進程間的相互作用的主機模式是C/S。在操作過程中采取的是主動請示方式:

首先效勞器方要先啟動,并根據請示提供相應效勞:1、翻開一通信通道并告知本地主機,它在某一個公認地址上接收客戶請求;2、等待客戶請求到達該端口;3、接收到重復效勞請求,處理該請求并發(fā)送應答信號;4、返回第2步,等待另一客戶請求;5、關閉效勞器??蛻舳耍?、翻開一通信通道,并連接到效勞器所在主機的特定端口;2、向效勞器發(fā)送效勞請求報文,等待并接收應答;繼續(xù)提出請求……3、請求結束后關閉通信通道并終止。2.1面向TCP系統(tǒng)調用時序圖圖二面向TCP的系統(tǒng)時序圖2.2面向UDP系統(tǒng)調用時序圖圖三面向UDP的系統(tǒng)時序圖3.功能實現3.1公共類設計軟件設計時,TCP和UDP的效勞器端為統(tǒng)一界面,客戶端為統(tǒng)一界面。即效勞器端既能夠接受TCP連接,也能通過UDP進行接收;客戶端可以通過TCP和UDP進行傳輸。3.1.1IP地址操作類1、IPAddress類在該類中有一個Parse()方法,可以把點分的十進制IP表示轉化IPAddress類,方法如下:

IPAddressaddress=IPAddress.Parse(“9〞);IPAddress提供4個只讀字段

Any用于代表本地系統(tǒng)可用的任何IP地址Broadcase用于代表本地網絡的IP播送地址Loopback用于代表系統(tǒng)的回送地址None用于代表系統(tǒng)上沒有網絡接口其中IPAddress.Any最常用可以用來表示本機上所有的IP地址,這對于socket效勞進行偵聽時便使用,不用對每個IP進行偵聽了。2、IPEndPoint類通過二種構造方法來創(chuàng)立IPEndPoint類:

a、IPEndPoint(longaddress,intport)

b、IPEndPoint(IPAddressaddress,intport)

它有四個屬性:

AddressAddressFamilyPortMaxPortMinPortIPEndPoint是一個IP地址和端口的綁定,可以代表一個效勞,用來Socket通訊。DNS相關類DNS類有四個靜態(tài)方法,來獲取主機DNS相關信息:1、GetHostName()通過Dns.GetHostName()可以獲得本地計算機的主機名2、GetHostByName()根據主機名稱,返回一個IPHostEntry對象:IPHostEntryGetHostByName(stringhostName)。其中IPHostEntry把一個DNS主機名與一個別名和IP地址的數組相關聯,包含三個屬性:AddressList:一個IPAddress對象的數組Aliases:一個字符串對象數組HostName:一個用于主機名的字符串對象3、GetHostByAddress()類似于GetHostByName(),只不過這里的參數是IP地址,而不是主機名,也返回一個IPHostEntry對象。IPHostEntryGetHostByAddress(IPAddressaddress)IPHostEntryGetHostByAddress(stringaddress)

4、Resolve()

當不知道輸入的遠程主機的地址是哪種格式時〔主機名或IP地址〕,用以上的二種方法來實現,可能還要通過判斷客戶輸入的格式,才能正確使用,但Dns類提供一更簡單的方法Resolve(),該方法可以接受或者是主機名格式或者是IP地址格式的任何一種地址,并返回IPHostEntry對象。3.2TCP文件傳輸3.2.1效勞器端1、創(chuàng)立IPEndPoint實例,用于Socket偵聽時綁定:IPEndPointipep=newIPEndPoint(IPAddress.Any,7000);2、創(chuàng)立套接字實例:serverSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);這里創(chuàng)立的時候用ProtocolType.Tcp,表示建立一個面向連接(TCP)的Socket。3、將所創(chuàng)立的套接字與IPEndPoint綁定:serverSocket.Bind(ipep)。4、設置套接字為收聽模式:serverSocket.Listen(10)。5、在套接字上接收接入的連接在此使用.net的線程池類,默認情況下創(chuàng)立25個線程。從線城池中獲取一個線程來處理客戶端請求。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實例和套接字;2、將套接字連接到遠程效勞器;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的數據塊進行傳送。效勞器端使用SaveFileDialog類選擇存儲文件的位置,然后接受客戶端發(fā)送的文件名和文件長度,然后進行小數據塊接受,使用循環(huán),直至客戶端發(fā)送完畢,效勞器端在接受客戶端連接請求時開辟了一個內存池。面向連接的程序流程圖如下所示:圖四面向TCP的程序流程圖3.3UDP文件傳輸TCP是面向連接的,所以用TCP傳輸文件不會丟包。UDP是非面向連接的,所以UDP是不可靠的,用它傳輸文件,要保證不丟包,就需要額外代碼來保障。本文采用的是在接受文件端來檢測,當開始接收文件,收到一個數據包后,如果等待超過了一定時間后都沒有收到數據包,就給發(fā)送方發(fā)送一個新的請求,要求繼續(xù)發(fā)送文件,直到文件全部接收完成。流程圖如下:圖五UDP傳輸流程3.3.1效勞器端在UDP效勞器端設計過程中,局部步驟和實現代碼與TCP相似,在此不再贅述。根本的實現步驟:1、創(chuàng)立一個socket,用函數socket();2、綁定IP地址、端口等信息到socket上,用函數bind();3、循環(huán)接收數據,用函數recvfrom();4、關閉網絡連接;為了實現UDP的可靠傳輸,設計了ReceiveFileManager類,如下列圖所示:圖六ReceiveFileManager類可靠傳輸的具體做法是:1、在ReceiveFileManager類中參加一個記錄文件分塊接收狀態(tài)的列表Dictionary<int,bool>,int表示文件分塊的序號,bool表示是否已經接收,初始化為全部沒有接受〔false〕。2、在ReceiveFileManager類中參加一個Timer,用來檢測收到一個包后等待的時間是否超過了設置的值,超過就給發(fā)送方發(fā)送數據包,請求繼續(xù)發(fā)送文件,需要發(fā)送的文件塊序號為從Dictionary<int,bool>中查詢出來的沒有接收的文件塊序號。3、如果Dictionary<int,bool>中的所有文件塊已經收到〔全部為true〕,文件就接收完成了。3.3.2客戶端在UDP客戶端設計過程中,局部步驟和實現代碼與TCP相似,在此不再贅述。根本的實現步驟:1、創(chuàng)立一個socket,用函數socket();

2、綁定IP地址、端口等信息到socket上,用函數bind();3、設置對方的IP地址和端口等屬性;

4、發(fā)送數據,用函數sendto();

5、關閉網絡連接;為了保證UDP的可靠傳輸,客戶端也需要對效勞器端某個端口的發(fā)送來的信息進行監(jiā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)的,而且沒有公開的構造函數。這個限制的目的是為了把所有的異步編程技術都集中到同一個池中。假設構造了含有兩個線程的線程池,當三個請求到達時,它們立刻安排到隊列等待被處理,因為兩個線程都是空閑的,所以頭兩個請求開始執(zhí)行。當其中任何一個請求處理結束后,空閑的線程就會去提取第三個請求并處理

溫馨提示

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

評論

0/150

提交評論