TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn)_第1頁
TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn)_第2頁
TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn)_第3頁
TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn)_第4頁
TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn)_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、長沙理工大學(xué)網(wǎng)絡(luò)協(xié)議編程課程設(shè)計論文周瑞杰學(xué)院計算機與通信工程專業(yè) 網(wǎng)絡(luò)工程班級 網(wǎng)絡(luò)08-02學(xué)號200858080204學(xué)生姓名周瑞杰指導(dǎo)教師王靜課程成績 完成日期2011年7月2日課程設(shè)計任務(wù)書計算機與通信工程學(xué)院網(wǎng)絡(luò)工程專業(yè)課程名稱網(wǎng)絡(luò)協(xié)議編程課程 設(shè)計時間20102011學(xué)年第二學(xué)期 1819周學(xué)生姓名周瑞杰指導(dǎo)老師王靜題目TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計與實現(xiàn)主要內(nèi)容:(1)掌握TCP和UDP的概念和工作原理;(2)熟練掌握C#語言的編程原理;(3)實現(xiàn)基于TCP協(xié)議的聊天程序設(shè)計;(4)實現(xiàn)基于UDP協(xié)議的聊天程序設(shè)計;(5)運行程序,并合理分析實驗結(jié)果。要求:(1)按要求編寫

2、課程設(shè)計報告書,能正確闡述設(shè)計結(jié)果。(2)通過課題設(shè)計培養(yǎng)學(xué)生嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,認(rèn)真工作作風(fēng)和團隊協(xié)作精神。(3)學(xué)會文獻(xiàn)檢索的基本方法和綜合運用文獻(xiàn)的能力。(4)在老師的指導(dǎo)下,要求每個學(xué)生獨立完成課程設(shè)計的全部內(nèi)容。應(yīng)當(dāng)提交的文件:(1)課程設(shè)計報告。(2)課程設(shè)計附件(主要是源程序)。課程設(shè)計成績評定學(xué) 院計算機通信工程專 業(yè)網(wǎng)絡(luò)工程班 級網(wǎng)絡(luò)08-02學(xué) 號200858080204學(xué)生姓名周瑞杰指導(dǎo)教師王靜課程成績完成日期2011年7月2日指導(dǎo)教師對學(xué)生在課程設(shè)計中的評價評分項目優(yōu)良中及格不及格課程設(shè)計中的創(chuàng)造性成果學(xué)生掌握課程內(nèi)容的程度課程設(shè)計完成情況課程設(shè)計動手能力文字表達(dá)學(xué)習(xí)態(tài)度規(guī)

3、范要求課程設(shè)計論文的質(zhì)量指導(dǎo)教師對課程設(shè)計的評定意見TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn)學(xué)生:周瑞杰指導(dǎo)老師:王靜摘要:在TCP/IP協(xié)議族中,傳輸層主要包括TCP和UDP兩種通信協(xié)議,它們以 不同的方式實現(xiàn)兩臺主機中的不同程序間之間的數(shù)據(jù)傳輸,即數(shù)據(jù)的端到端傳 輸。TCP提供一種面向連接的、可靠的數(shù)據(jù)傳輸服務(wù),保證了端到端數(shù)據(jù)傳輸?shù)?可靠性;而UDP提供一種無連接的、不可靠的數(shù)據(jù)傳輸方式,但保證了數(shù)據(jù)傳輸 的實時性。本課程設(shè)計用C#語言分別編寫了基于TCP的C/S聊天程序和基于UDP 的C/S聊天程序。經(jīng)測試,本文程序基本實現(xiàn)了聊天功能,即實現(xiàn)了 TCP和UDP數(shù) 據(jù)包發(fā)送程序的設(shè)計。關(guān)

4、鍵詞:TCP、UDP、C#、C/S聊天程序、數(shù)據(jù)包發(fā)送程序Design and Realization of the Sending Program of TCP and UDP PacketsStudent:Zhou Ruijie Instructor:WangJingAbstract: In the TCP / IP protocol clan, the transport layer mainly includes two communication protocols TCP and UDP, which had achieved the data transmission among

5、 different programs between two hosts in different ways, namely the end-to-end data transmission. TCP provides a connection-oriented, reliable data transmission service, ensuring the reliability of the end-to-end data transmission; While UDP provides a connectionless, unreliable way of data transmis

6、sion, but guaranteeing the data transmission in real-time. This course design has separately written TCP-based C/S chat program and UDP-based C/S chat program in C#. By test, this paper program has basically achieved chat function, namely realized the design of the sending program of TCP and UDP pac

7、kets.Keywords: TCP、UDP、C#、C/S chat program、sending program of packets目錄 TOC o 1-5 h z 1弓|言11.1課程設(shè)計的目的11.2本設(shè)計任務(wù)和主要內(nèi)容12開發(fā)工具及相關(guān)技術(shù)2 HYPERLINK l bookmark32 o Current Document 2.1。#簡介2 HYPERLINK l bookmark42 o Current Document TCP 和 UDP 概述2 HYPERLINK l bookmark56 o Current Document C/S 模式4 HYPERLINK l boo

8、kmark59 o Current Document 3基于TCP的C/S聊天程序的詳細(xì)設(shè)計6 HYPERLINK l bookmark62 o Current Document TCP設(shè)計思路6 HYPERLINK l bookmark65 o Current Document 3.2客戶端編程步驟8 HYPERLINK l bookmark71 o Current Document 3.3服務(wù)器端編程步驟9 HYPERLINK l bookmark77 o Current Document 4基于UDP的C/S聊天程序的詳細(xì)設(shè)計11 HYPERLINK l bookmark80 o Cur

9、rent Document UDP設(shè)計思路11 HYPERLINK l bookmark83 o Current Document 客戶端編程步驟 12 HYPERLINK l bookmark86 o Current Document 服務(wù)器端編程步驟13 HYPERLINK l bookmark89 o Current Document 5結(jié)果分析14 HYPERLINK l bookmark92 o Current Document TCP聊天程序運行結(jié)果14UDP聊天程序運行結(jié)果175.3結(jié)果分析176結(jié)束語187參考文獻(xiàn)19附錄1: TCP源程序清單20附錄2: UDP源程序清單33

10、UP 周瑞杰TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn)第1頁共35頁1引言自進入信息化社會以來,人們的生活發(fā)生了翻天覆地的變化,所有這一切的 實現(xiàn)都要歸功于計算機網(wǎng)絡(luò)。自從計算機網(wǎng)絡(luò)出現(xiàn)以來,網(wǎng)絡(luò)發(fā)展越來越迅速, 其重要性更是不可估量。現(xiàn)在,網(wǎng)絡(luò)已經(jīng)進入到我們生活的各個角落,大到網(wǎng)上 理財、網(wǎng)上會議、網(wǎng)上戰(zhàn)爭,小到上網(wǎng)購物、查找資料,網(wǎng)上聊天等,可以說網(wǎng) 絡(luò)把我們的世界變“小”了,即使在天涯海角,我們也可以隨時聯(lián)系。一個最簡 單且應(yīng)用最廣泛的例子一一網(wǎng)上聊天,就是最好的證明。本課程設(shè)計將基于TCP 和UDP協(xié)議,使用C#語言分別實現(xiàn)一個C/S聊天程序。1.1課程設(shè)計的目的本次課程設(shè)計是用C#分別

11、編寫基于TCP和UDP協(xié)議的C/S聊天程序,所以 其基本任務(wù)就是要實現(xiàn)客戶端和服務(wù)器端的通信,即客戶端和服務(wù)器對端能夠互 相發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。其中TCP是面向連接的協(xié)議,所以在客戶端和服務(wù)器 端在通信之前必須先由服務(wù)器端監(jiān)聽,客戶端發(fā)送連接請求,成功建立連接后才 能進行通信,這個機制保證了數(shù)據(jù)傳輸?shù)目煽啃浴崿F(xiàn)了這個過程,就達(dá)到了本 次課程設(shè)計TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn)的目的。1.2本設(shè)計任務(wù)和主要內(nèi)容掌握TCP和UDP的概念和工作原理;熟練掌握C#語言的編程原理;實現(xiàn)基于TCP協(xié)議的聊天程序設(shè)計;實現(xiàn)基于UDP協(xié)議的聊天程序設(shè)計;運行程序,并合理分析實驗結(jié)果。2.1 0#簡介

12、C#(C Sharp)是微軟(Microsoft)為.NET Framework量身訂做的程序語言,C#擁 有C/C+的強大功能以及Visual Basic簡易使用的特性,是第一個組件導(dǎo)向 (Component-oriented)的程序語言,和C+與Java 一樣亦為對象導(dǎo)向 (object-oriented)程序語言。C#具有以下特點:(1)語法簡潔。(2)面向?qū)ο笤O(shè)計。(3)與Web緊密結(jié)合。(4)完整的安全性和錯誤處理。(5)版本控制。(6)兼容性。(7)靈活性。2.2 TCP和UDP概述在TCP/IP協(xié)議族中,傳輸層主要包括TCP和UDP兩種通信協(xié)議,它們以 不同的方式實現(xiàn)兩臺主機中的

13、不同應(yīng)用程序之間的數(shù)據(jù)傳輸,即數(shù)據(jù)的端到端傳 輸。由于它們的實現(xiàn)方式不同,因此各有一套屬于自己的端口號,且相互獨立。 可以采用如下五元組來描述兩個應(yīng)用進程之間的通信關(guān)聯(lián)。(協(xié)議,信源機IP地 址,信源應(yīng)用進程端口,信宿機IP地址,信宿應(yīng)用進程端口)即端到端之間的 一條通信連接就可以表示為上述五元組,這也是進行網(wǎng)絡(luò)程序設(shè)計最基本的概 念。其中,傳輸控制協(xié)議(Transmission Control Protocol, TCP)提供一種面向 連接的、可靠的數(shù)據(jù)傳輸服務(wù),保證了端到端數(shù)據(jù)傳輸?shù)目煽啃浴R舱驗檫@樣, 使TCP協(xié)議成為傳輸層最常用的協(xié)議,同時也是一個比較復(fù)雜的協(xié)議,其提供 了傳輸層幾乎

14、所有的功能。因此和IP協(xié)議一樣,成為了 TCP/IP協(xié)議族中最重要的協(xié)議之一。其主要特點如下:(1)向應(yīng)用進程提供面向連接的服務(wù),兩個需要通過TCP協(xié)議進行數(shù)據(jù)傳輸?shù)?應(yīng)用進程之間首先必須建立一個TCP連接,并且在數(shù)據(jù)傳輸完成后要釋放連接。 一般將請求連接的應(yīng)用進程稱為客戶進程,而響應(yīng)連接請求的應(yīng)用進程稱為服務(wù) 器進程,即TCP連接的建立采用的是一種客戶機/服務(wù)器工作模型。(2)提供全雙工數(shù)據(jù)傳輸服務(wù),只要建立了 TCP連接,就能在兩個應(yīng)用進程間 進行雙向的數(shù)據(jù)傳輸服務(wù),但是這種傳輸只是端到端的傳輸,不支持廣播和多播。(3)提供面向字節(jié)流的服務(wù),即TCP協(xié)議的數(shù)據(jù)傳輸是面向字節(jié)流的,兩個建 立

15、了 TCP連接的應(yīng)用進程之間交換的是字節(jié)流。發(fā)送進程以字節(jié)流形式發(fā)送數(shù) 據(jù),接收進程也把數(shù)據(jù)作為字節(jié)流來接收。端到端之間不保留數(shù)據(jù)記錄的邊界, 也就是說,在傳輸?shù)膶用嫔喜淮嬖跀?shù)據(jù)記錄的概念。用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol,UDP)是傳輸層的兩個主要協(xié)議 之一,相對TCP協(xié)議來說,UDP是一種非常簡單的協(xié)議,在網(wǎng)絡(luò)層的基礎(chǔ)上實 現(xiàn)了應(yīng)用進程之間端到端的通信。與TCP協(xié)議不同,UDP協(xié)議是一種無連接的 協(xié)議,數(shù)據(jù)在傳輸之前通信雙方不需要建立連接。信宿在收到UDP數(shù)據(jù)報之后 也不需要給出任何應(yīng)答報文。發(fā)送方發(fā)出的每一個UDP用戶數(shù)據(jù)報都是獨立的, 都攜帶了完整的目的地址

16、。每個數(shù)據(jù)報都可以被網(wǎng)絡(luò)系統(tǒng)獨立路由。因此從同一 個信源發(fā)往同一個信宿的多個UDP報文可能選擇不同的路徑達(dá)到信宿,它們達(dá) 到的先后順序也可能不同于發(fā)送順序。所以,UDP協(xié)議提供的是一種無連接的、 不可靠的數(shù)據(jù)傳輸方式,在數(shù)據(jù)傳輸過程中沒有流量控制和確認(rèn)機制,數(shù)據(jù)報可 能會丟失、延遲、亂序到達(dá)信宿。UDP協(xié)議只是提供了利用校驗和檢查數(shù)據(jù)完 整性的簡單差錯控制,屬于一種盡力而為的數(shù)據(jù)傳輸方式。雖然UDP用戶數(shù)據(jù)報提供不可靠的傳輸方式,但它具有其自身的一些特點:(1)UDP是一個無連接協(xié)議,傳輸數(shù)據(jù)之前信源和信宿不需要建立連接,因此 不存在連接建立的時延。在信源端,UDP傳送數(shù)據(jù)的速度僅僅受應(yīng)用程序

17、生成 數(shù)據(jù)的速度、計算機的能力和傳輸帶寬的限制;在信宿端,UDP把每個數(shù)據(jù)報 放在隊列中,應(yīng)用程序每次從隊列中讀一個數(shù)據(jù)報。(2)由于傳輸數(shù)據(jù)不需要建立連接,也就不需要維護連接狀態(tài),包括收發(fā)狀態(tài) 等,這樣一臺服務(wù)機可同時向多個客戶機傳輸相同的數(shù)據(jù),例如實現(xiàn)多播。(3)UDP數(shù)據(jù)報的首部很短,只有8字節(jié),相對于TCP的20字節(jié)首部的開銷 要小很多。(4)吞吐量不受流量控制算法的調(diào)節(jié),只受應(yīng)用軟件生成數(shù)據(jù)的速率、傳輸帶 寬、信源和信宿主機性能的限制。由于UDP具有這些特點,有許多應(yīng)用更適合使用UDP協(xié)議,如:(1)只需要簡單數(shù)據(jù)交換的應(yīng)用,例如DNS服務(wù),它不需要復(fù)雜的可靠性保證 機制,這樣,利用

18、UDP來傳輸數(shù)據(jù)既可以節(jié)省系統(tǒng)開銷又提高了網(wǎng)絡(luò)的傳輸效 率。(2)不需要關(guān)心數(shù)據(jù)的差錯控制和流量控制的應(yīng)用。(3)實時性要求較高但可承受一定的數(shù)據(jù)錯誤的應(yīng)用,例如實時語音傳輸、實 時視頻通信等。(4)實現(xiàn)一對多數(shù)據(jù)發(fā)送的應(yīng)用,例如廣播和組播。2.3 C/S模式在網(wǎng)絡(luò)連接模式中,除對等網(wǎng)外,還有另一種形式的網(wǎng)絡(luò),即客戶機/服務(wù)器 網(wǎng),Client/Server。在客戶機/服務(wù)器網(wǎng)絡(luò)中,服務(wù)器是網(wǎng)絡(luò)的核心,而客戶機是 網(wǎng)絡(luò)的基礎(chǔ),客戶機依靠服務(wù)器獲得所需要的網(wǎng)絡(luò)資源,而服務(wù)器為客戶機提供 網(wǎng)絡(luò)必須的資源。它是軟件系統(tǒng)體系結(jié)構(gòu),通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務(wù) 合理分配到Client端和

19、Server端來實現(xiàn),降低了系統(tǒng)的通訊開銷。目前大多數(shù) 應(yīng)用軟件系統(tǒng)都是Client/Server形式的兩層結(jié)構(gòu),由于現(xiàn)在的軟件應(yīng)用系統(tǒng)正在 向分布式的Web應(yīng)用發(fā)展,Web和Client/Server應(yīng)用都可以進行同樣的業(yè)務(wù)處 理,應(yīng)用不同的模塊共享邏輯組件;因此,內(nèi)部的和外部的用戶都可以訪問新的 和現(xiàn)有的應(yīng)用系統(tǒng),通過現(xiàn)有應(yīng)用系統(tǒng)中的邏輯可以擴展出新的應(yīng)用系統(tǒng)。這也 就是目前應(yīng)用系統(tǒng)的發(fā)展方向。C/S工作過程如下:服務(wù)器端描述:S端啟動服務(wù)進程,并監(jiān)聽相應(yīng)端口。然后,若收到C端發(fā) 出的有關(guān)請求,按如下情況給出相應(yīng)的反映:將收到的包進行檢測,若收到的包 有錯則拋棄(discard),并發(fā)給C

20、端一個negtive ACK。若收到的包正常,則將此 包進行解包,將內(nèi)容輸出至一臨時文件;并發(fā)給C端一個positive ACK。依次收 到來自C端的包,直到收到end為止,并關(guān)閉此進程,轉(zhuǎn)回監(jiān)聽狀態(tài)。客戶端描述為:若收到的為Positive ACK,則繼續(xù)發(fā)包;若收到的為Negtive ACK,則將應(yīng)發(fā)的包重發(fā)。直到C端將所有要發(fā)的包都發(fā)完,并都已經(jīng)收到S端 的回應(yīng),最后發(fā)一個End包,直接關(guān)閉此進程。綜上所述,應(yīng)用中的服務(wù)器程序必須先于客戶機進程啟動,直到對客戶機的 響應(yīng)結(jié)束或強迫終止。3基于TCP的C/S聊天程序的詳細(xì)設(shè)計3.1 TCP設(shè)計思路為了簡化編程,.NET提供面向TCP編程的相

21、關(guān)類,主要包括TcpClient和 TcpListener。TcpClient類為TCP網(wǎng)絡(luò)服務(wù)提供客戶端連接,它構(gòu)建于Socket類之上,以 提供較高級別的TCP服務(wù),即提供了通過網(wǎng)絡(luò)連接、發(fā)送和接收數(shù)據(jù)的簡單方 法。用于在同步阻止模式下通過網(wǎng)絡(luò)來連接、發(fā)送和接收流數(shù)據(jù)。另外,通過與 NetworkStream對象的關(guān)聯(lián),使得用戶可以通過流操作方式實現(xiàn)對網(wǎng)絡(luò)連接狀態(tài) 下數(shù)據(jù)的發(fā)送和接收。通過TcpClient類實現(xiàn)與TCP主機的通信流程如下圖所示:圖3-1 TcpClient類通信流程圖TcpClient類實現(xiàn)了客戶端編程抽象,因此構(gòu)建客戶端網(wǎng)絡(luò)應(yīng)用程序便可以 直接使用TcpClient取代

22、Socket,更加方便易用。同樣,對于服務(wù)器端應(yīng)用程序 的構(gòu)建,C#提供了 TcpListener類。該類也是構(gòu)建于Socket之上,提供了更高抽 象級別的TCP服務(wù),使得程序員能更方便地編寫服務(wù)器端應(yīng)用程序。通常情況下,服務(wù)器端應(yīng)用程序在啟動時將首先綁定本地網(wǎng)絡(luò)接口的IP地 址和端口號,然后進入偵聽客戶請求的狀態(tài),以便于客戶端應(yīng)用程序提出顯式請 求。一旦偵聽到有客戶端應(yīng)用程序請求連接偵聽端口,服務(wù)器端應(yīng)用將接受請求, 并建立一個負(fù)責(zé)與客戶端應(yīng)用程序通信的信道,即通過創(chuàng)建連接套接字與客戶端 應(yīng)用程序建立連接,由連接套接字完成與客戶端應(yīng)用程序的數(shù)據(jù)傳送操作,服務(wù) 器端應(yīng)用程序繼續(xù)偵聽更多的客戶端

23、連接請求。TcpListener通過實例創(chuàng)建過程完 成與本地網(wǎng)絡(luò)接口的綁定,并由所創(chuàng)建的實例調(diào)用Start方法啟動偵聽;當(dāng)偵聽 到客戶端應(yīng)用程序的連接請求后,根據(jù)客戶端應(yīng)用程序的不同請求方式,可以通 過AcceptTcpClient方法接受傳入的連接請求并創(chuàng)建TcpClient實例以處理請求, 或者通過AcceptSocket方法接受傳入的連接請求并創(chuàng)建Socket實例以處理請求, 并由所創(chuàng)建的TcpClient實例或Socket實例完成與客戶端應(yīng)用程序的網(wǎng)絡(luò)數(shù)據(jù)傳 輸。最后,需要使用Stop關(guān)閉用于偵聽傳入連接的Socket,同時也必須關(guān)閉從 AcceptSocket或AcceptTcpCl

24、ient返回的任何實例,以釋放相關(guān)資源。其實現(xiàn)流程 如下圖所示:圖3-2 TcpListener類通信流程圖3.2客戶端編程步驟新建一個客戶端窗口程序:FormClient對窗口程序進行界面設(shè)計,由于功能比較簡單,并沒有做做到盡善盡美, 只是做到簡單的通信與顯示信息,主要用到了三個主要空間:LlistBoxStatus, TextBox, Button,其中,LlistBoxStatus用來顯示與服務(wù)器端的連接狀態(tài),兩個 TextBox分別表示接收的信息和準(zhǔn)備發(fā)送的信息,兩個Button分別用來表示連接 和發(fā)送。將各控件的名字改為有實際意義,容易標(biāo)記的名字。核心代碼編寫進入編寫代碼模式,在開頭

25、中添加所要用到的命名空間如: using System.Net; /提供一個統(tǒng)一、簡單的編程接口 using System.Net.Sockets;/提供 Windows 套接字接口的托管實現(xiàn) using System.Threading;/提供類和接口支持線程程序設(shè)計所需實現(xiàn)功能如下代碼描述了 TcpClient實例的創(chuàng)建以及與指定遠(yuǎn)程主機的連接過程。 client = new TcpClient(AddressFamily.InterNetwork);/創(chuàng)建實例 client.BeginConnect(serverIP0, 51888, requestCallback, client);

26、listBoxStatus.Invoke(setListBoxCallback, string.Format( 本機 EndPoint : 0,client.Client.LocalEndPoint);listBoxStatus.Invoke(setListBoxCallback, 開始與服務(wù)器建立連接);與遠(yuǎn)程主機連接成功后,利用NetworkStream實例發(fā)送和接收數(shù)據(jù)。該方法 首先通過client.GetStream來返回NetWorkStream實例,進而利用所獲取的 NetworkStream實例的讀寫方法Write 和 Read來發(fā)送和接收數(shù)據(jù),其實現(xiàn)代碼如 下所示: try(獲

27、取連接成功后得到的狀態(tài)參數(shù)client = (TcpClient)ar.AsyncState;/異步接受傳入的連接嘗試,使BeginConnect正常結(jié)束 client.EndConnect(ar);listBoxStatus.Invoke(setListBoxCallback, string.Format( 與服務(wù)器0連接成功, client.Client.RemoteEndPoint);獲取接收和發(fā)送數(shù)據(jù)的網(wǎng)絡(luò)流networkStream = client.GetStream();接收服務(wù)器發(fā)送的數(shù)據(jù),BeginRead完成后,會自動調(diào)用ReadCallbackReadObject rea

28、dObject =new ReadObject(networkStream, client.ReceiveBufferSize);networkStream.BeginRead(readObject.bytes,0, readObject.bytes.Length, ReadCallback, readObject);/ allDone.WaitOne();在與服務(wù)器完成通信后,應(yīng)該調(diào)用Close()方法釋放所有的資源。3.3服務(wù)器端編程步驟新建一個服務(wù)器端窗口程序:FormServer對窗口程序進行界面設(shè)計,由于功能比較簡單,并沒有做做到盡善盡美, 只是做到簡單的通信與顯示信息,主要用到了三

29、個主要空間:LlistBoxStatus, TextBox, Button,其中,LlistBoxStatus用來顯示與客戶端的連接狀態(tài),兩個 TextBox分別表示接收的信息和準(zhǔn)備發(fā)送的信息,三個Button分別用來表示開始 監(jiān)聽、停止監(jiān)聽和發(fā)送。將各控件的名字改為有實際意義,容易標(biāo)記的名字。核心代碼編寫進入編寫代碼模式,在開頭中添加所要用到的命名空間如: using System.Net; /提供一個統(tǒng)一、簡單的編程接口 using System.Net.Sockets;/提供 Windows 套接字接口的托管實現(xiàn) using System.Threading;/提供類和接口支持線程程序設(shè)

30、計所需實現(xiàn)功能創(chuàng)建TcpListener實例,調(diào)用Start方法啟動偵聽,即該方法調(diào)用TcpListener 實例的基礎(chǔ)Socket上的Listen方法,開始偵聽客戶的連接請求,代碼如下: private void AcceptConnect()(/獲取本機所有IP地址IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName(); listener = new TcpListener(ip0, 51888);/創(chuàng)建實例 listener.Start();/開始偵聽當(dāng)偵聽到有客戶連接請求時,使用AcceptTcpClient接收任何當(dāng)前在隊列中 掛起

31、的連接請求,并返回一個TcpClient實例以接受客戶的連接請求,如下面代碼所示:private void AcceptTcpClientCallback(IAsyncResult ar)(try(將事件狀態(tài)設(shè)為終止?fàn)顟B(tài),允許一個或多個等待線程繼續(xù) allDone.Set();TcpListener myListener = (TcpListener)ar.AsyncState;異步接收傳入的連接,創(chuàng)建新的TcpClient對象處理遠(yuǎn)程主機通信TcpClient client = myListener.EndAcceptTcpClient(ar);listBoxStatus.Invoke(se

32、tListBoxCallback, 已接受客戶連接: + client.Client.RemoteEndPoint);comboBox1.Invoke(setComboBoxCallback,client.Client.RemoteEndPoint.ToString();ReadWriteObject readWriteObject二new ReadWriteObject(client);clientList.Add(readWriteObject);SendString(readWriteObject, 服務(wù)器已經(jīng)接受連接,請通話! );由于返回的是TcpClient實例,所以可以通過對Ne

33、tworkStream的讀寫來實 現(xiàn)與客戶的通信。在這里引入了多線程技術(shù),為每個客戶的連接建立一個線程, 在該線程中實現(xiàn)與客戶的數(shù)據(jù)通信,代碼如下:ThreadStart ts = new ThreadStart(AcceptConnect);/客戶連接Thread myThread = new Thread(ts);/創(chuàng)建線程myThread.Start();/啟動線程與客戶程序通信完成之后,最后一步是停止監(jiān)聽套接字,調(diào)用TcpListener 的Stop方法來實現(xiàn)private void FormServer_FormClosing(object sender,FormClosingEve

34、ntArgs e)buttonStop_Click(null, null);4基于UDP的C/S聊天程序的詳細(xì)設(shè)計4.1 UDP設(shè)計思路UdpClient類是基于Socket類的較高級別抽象,提供了較高級別的UDP服 務(wù)。在.NET環(huán)境中基于UDP協(xié)議的網(wǎng)絡(luò)程序設(shè)計可以直接用UdpClient類。用 于在阻止同步模式下發(fā)送和接收無連接UDP數(shù)據(jù)報,使用簡單直觀。基于UdpClient的網(wǎng)絡(luò)應(yīng)用編程首先需要創(chuàng)建一個UdpClient類實例,接著 通過調(diào)用其Connect方法連接到遠(yuǎn)程主機。當(dāng)然,這兩步也可以直接由指定遠(yuǎn)程 主機名和端口號的UdpClient類構(gòu)造函數(shù)完成。然后便可以利用Send和

35、Receive 方法來發(fā)送和接收數(shù)據(jù)。最后調(diào)用Close方法關(guān)閉UDP連接,并釋放相關(guān)資源。 其實現(xiàn)流程如下圖所示:基于UDP的C/S聊天程序相對基于TCP的C/S聊天程序來說實現(xiàn)比較簡單, 因為UDP不需要建立連接,而且在設(shè)計程序時沒有創(chuàng)建窗口,而是直接開始編 程。分別編寫客戶端和服務(wù)器端的C#程序。42客戶端編程步驟啟動Visual Studio2008,選擇【文件】I【新建】I【項目】命令,彈出【新建 項目】對話框,在左側(cè)【項目類型】列表中選擇【Visual C#,在右側(cè)【模板】 列表框中選擇【控制臺應(yīng)用程序】,在【名稱】文本框中輸入“ UDPClient” , 在【位置】文本框中輸入項

36、目保存路徑,單擊【確定】按鈕。然后在項目中編寫 程序。首先需要引入命名空間:using System.Net;using System.Net.Sockets;在編寫客戶端程序時,創(chuàng)建UDPClient實例并指定連接信息后,就開始設(shè)計 數(shù)據(jù)的發(fā)送和接收,使用send方法來完成數(shù)據(jù)發(fā)送操作。其中核心代碼如下面 所示:設(shè)置服務(wù)IP,設(shè)置TCP端口號IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(), 8001);/定義網(wǎng)絡(luò)類型,數(shù)據(jù)連接類型和網(wǎng)絡(luò)協(xié)議UDPSocket server = new Socket(AddressFamily.InterN

37、etwork, SocketType.Dgram, ProtocolType.Udp);/客戶端向服務(wù)器端發(fā)送的第一個數(shù)據(jù)包string welcome = Hello!;data = Encoding.ASCII.GetBytes(welcome);/在指定了連接信息后,直接給出數(shù)據(jù)及其長度進行發(fā)送server.SendTo(data, data.Length, SocketFlags.None, ipep);/將UDP數(shù)據(jù)報發(fā)送到指定的主機上的指定端口IPEndPoint sender = new IPEndPoint(IPAddress.Any 0);EndPoint Remote =

38、(EndPoint)sender;data = new byte1024;/接收數(shù)據(jù),數(shù)據(jù)來自遠(yuǎn)方的Remoteint recv = server.ReceiveFrom(data, ref Remote);使用UDPClient的最后一步是關(guān)閉連接,在這里直接調(diào)用UDPClient的Close 方法來實現(xiàn)。43服務(wù)器端編程步驟啟動Visual Studio2008,選擇【文件】I【新建】I【項目】命令,彈出【新建 項目】對話框,在左側(cè)【項目類型】列表中選擇【Visual C#,在右側(cè)【模板】 列表框中選擇【控制臺應(yīng)用程序】,在【名稱】文本框中輸入“UDPServer” , 在【位置】文本框中

39、輸入與客戶端相同的保存路徑,單擊【確定】按鈕。然后在 項目中編寫程序。同樣的,在服務(wù)器端編程時也需要引入如下命名空間:using System.Net;using System.Net.Sockets;整個程序的核心代碼如下構(gòu)建TCP服務(wù)器IPEndPoint ipep = new IPEndPoint(IPAddress.Any 8001);/得到本機IP,設(shè)置TCP端口號Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);/綁定網(wǎng)絡(luò)地址newsock.Bind

40、(ipep);while (true)data = new byte1024;/接受信息recv = newsock.ReceiveFrom(data, ref Remote);發(fā)送信息newsock.SendTo(Encoding.ASCII.GetBytes(input), Remote);/newsock.SendTo(data, recv, SocketFlags.None, Remote);客戶端和服務(wù)器端程序都編寫好后,經(jīng)過調(diào)試和運行,就可以實現(xiàn)簡單的通 信了,結(jié)果將在后面部分進行分析。5結(jié)果分析51 TCP聊天程序運行結(jié)果初始界面如下所示:服務(wù)器端首先“開始監(jiān)聽”,客戶端打開“連

41、接”按鈕,服務(wù)器端監(jiān)聽到客戶端的鏈接請求后,會顯示下面的的結(jié)果:|詞異步TCP聊天服務(wù)卷翠找態(tài)信息開始等待客戶連接已接受客戶連接:10. 11. 13.238:1721開始等待客口連接向38:1721發(fā)送:服蓉器已經(jīng)接愛連接,話通話?開始監(jiān)聽接收的信息準(zhǔn)備發(fā)送的信息5-3服務(wù)器端成功監(jiān)聽到客戶端的連接請求情況圖客戶端和服務(wù)器端進行連接后,可以進行正常的聊天了。客戶端與服務(wù)器端通話情況如下圖所示:囿異步TCP喋天服務(wù)器端狀態(tài)信息開始等待客戶連接已接受客戶連接:10. 11. 13.238:1721開珈等待客口連捂向38:1721發(fā)送:服務(wù)器已經(jīng)接受連接,請通話?向10. 11. 13. 238:

42、1花1發(fā)送:你好10. 11. 13.238:1721:送:很木錯?開始監(jiān)聽停止監(jiān)聽接收的信息來自10. 11. 13.238:1721你好,我是周瑞杰來自10. 11. 13.238:1721這是一個基于TCF的聊天程序準(zhǔn)備發(fā)送的信息圖5-5實現(xiàn)通信后的服務(wù)器端界面圖接收方:38:1721發(fā)送52 UDP聊天程序運行結(jié)果運行程序后,初始界面如下:e HYPERLINK D:/C#/UDP/UDPServer/UDPServer/bin/Debug/HDPServer file:/D:/C#/UDP/UDPServer/UDPServer/bin/Debug/HDPServer. EXEThi

43、s is a Sepuer, host name is 20110528-1945Waiting for a clientMessage veceiued from :1702:Hello*圖5-7服務(wù)器端初始界面圖成 HYPERLINK D:/Cf/IIDP/IIDPCIient/IIDPCIient/bin/Debug/IIDPCIient file:/D:/Cf/IIDP/IIDPCIient/IIDPCIient/bin/Debug/IIDPCIient. EXEThis is a Client, host name is 20110528-1945Message receiued f

44、rom :8001:Welcome !Client:圖5-9 通信后的客戶端界面圖圖5-10通信后的服務(wù)器端界面圖圖5-8客戶端初始界面圖53結(jié)果分析根據(jù)以上程序的執(zhí)行情況可知,服務(wù)器端和客戶端實現(xiàn)成功的連接。根據(jù)客 戶端和服務(wù)器端的通信狀況可知,所設(shè)計的聊天程序符合要求,達(dá)到了預(yù)期的目 標(biāo)。本次課程設(shè)計是利用C#編寫的,經(jīng)過這兩周的學(xué)習(xí),我受益匪淺。首先, 我復(fù)習(xí)了之前學(xué)的C#網(wǎng)絡(luò)編程知識,弄懂了 C#編程的方法和規(guī)則。其次,更加 全面的了解并掌握TCP和UDP這兩個網(wǎng)絡(luò)層協(xié)議的概念和工作原理。本次課程設(shè) 計分別實現(xiàn)了一個TCP的C/S聊天程序和一個UDP的C/S聊天程序。從一點點思 想到流

45、程圖再到整個程序的編寫,調(diào)試,無一不花費了我許多的精力。看著自己 的勞動果實,反倒十分的欣慰,更認(rèn)識到自己的不足。今后的學(xué)習(xí)過程中要不斷 的積累經(jīng)驗,開闊思維以得到提高。總之,課程設(shè)計的過程就是一個汲取知識的過程,從中受益匪淺,通過這次 課程設(shè)計使我懂得了理論與實踐相結(jié)合的重要性,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的, 只有把所學(xué)的理論知識與實踐結(jié)合起來,從實踐中得出結(jié)論,才能真正的提高。 同時,也使我認(rèn)識到自己動手能力太差,為我以后的學(xué)習(xí)和發(fā)展敲了一個警鐘! 本次課程設(shè)計的過程中,雖然遇到了不少問題,但最后還是成功的完成了,這得 益于老師的指導(dǎo)和同學(xué)們的幫助,同時,也使我充分體驗到了團結(jié)的重要性。最后,

46、在這里我要感謝學(xué)校為我們提供這次鍛煉的機會,同時也感謝各位老 師對我的指導(dǎo)和同學(xué)們的幫助,希望以后能多有這樣的鍛煉機會。周瑞杰TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn)第19頁 共35頁7參考文獻(xiàn)1謝希仁.算機網(wǎng)絡(luò)M. 4版.北京:電子工業(yè)出版社,2003. 金華,華進.C#網(wǎng)絡(luò)編程技術(shù)教程.北京:人民郵電出版社,2003.雷震甲.計算機網(wǎng)絡(luò)管理.西安:西安電子科技大學(xué)出版社,2005.鄭宇軍,王侃.C#語言程序設(shè)計基礎(chǔ).北京:清華大學(xué)出版社,2008.殷肖川劉志宏.網(wǎng)絡(luò)編程與開發(fā)技術(shù).西安:西安交通大學(xué)出版社.2005.附錄1: TCP源程序清單/程序名稱:TCP和UDP數(shù)據(jù)包發(fā)送程序/程序功

47、能:用#實現(xiàn)TCP和UDP的C/S聊天程序。/程序作者:周瑞杰/最后修改日期:2011-7-2Tcp服務(wù)器端源程序/FormServr.cs/using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;添加的命名空間using System.Net;using System.Net.Sockets;using System.Threading

48、;using System.IO;namespace AsyncTcpServerpublic partial class FormServer : Formprivate bool isExit = false;保存連接的所有客戶端System.Collections.ArrayList clientList = new System.Collections.ArrayList();TcpListener listener;用于線程間互操作private delegate void SetListBoxCallback(string str);private SetListBoxCallba

49、ck setListBoxCallback;private delegate void SetRichTextBoxCallback(string str);private SetRichTextBoxCallback setRichTextBoxCallback;private delegate void SetComboBoxCallback(string str);private SetComboBoxCallback setComboBoxCallback;private delegate void RemoveComboBoxItemsCallback(ReadWriteObject

50、 readWriteObject);private RemoveComboBoxItemsCallback removeComboBoxItemsCallback;/用于線程同步,初始狀態(tài)設(shè)為非終止?fàn)顟B(tài),使用手動重置方式private EventWaitHandle allDone =new EventWaitHandle(false, EventResetMode.ManualReset);public FormServer()InitializeComponent();/構(gòu)造函數(shù),初始化時會執(zhí)行其中的代碼 listBoxStatus.HorizontalScrollbar = true;s

51、etListBoxCallback = new SetListBoxCallback(SetListBox);setRichTextBoxCallback = new SetRichTextBoxCallback(SetReceiveText);setComboBoxCallback = new SetComboBoxCallback(SetComboBox);removeComboBoxItemsCallback =new RemoveComboBoxItemsCallback(RemoveComboBoxItems);private void buttonStart_Click(objec

52、t sender, EventArgs e)由于服務(wù)器要為多個客戶服務(wù),所以需要創(chuàng)建一個線程監(jiān)聽客戶端連接請求ThreadStart ts = new ThreadStart(AcceptConnect);/創(chuàng)建連接Thread myThread = new Thread(ts);創(chuàng)建線程myThread.Start();/啟動線程buttonStart.Enabled = false;buttonStop.Enabled = true;private void AcceptConnect()/獲取本機所有IP地址IPAddress ip = Dns.GetHostAddresses(Dns.

53、GetHostName();listener = new TcpListener(ip0, 51888); 創(chuàng)建TcpListener實例listener.Start();/啟動偵聽while (isExit = false)try將事件的狀態(tài)設(shè)為非終止allDone.Reset();引用在異步操作完成時調(diào)用的回調(diào)方法AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);listBoxStatus.Invoke(setListBoxCallback,開始等待客戶連接);開始一個異步操作接受傳入的連接嘗試 list

54、ener.BeginAcceptTcpClient(callback, listener);/阻塞當(dāng)前線程,直到收到客戶連接信號allDone.WaitOne();catch (Exception err)listBoxStatus.Invoke(setListBoxCallback, err.Message); 將#周瑞杰 TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn) 第22頁共35頁 break; /ar是lAsyncResult類型的接口,表示異步操作的狀態(tài) 是由listener.BeginAcceptTcpClient(callback, listener)傳遞過來的 private vo

55、id AcceptTcpClientCallback(IAsyncResult ar) try 將事件狀態(tài)設(shè)為終止?fàn)顟B(tài),允許一個或多個等待線程繼續(xù) allDone.Set(); TcpListener myListener = (TcpListener)ar.AsyncState; 異步接收傳入的連接,并創(chuàng)建新的TcpClient對象處理遠(yuǎn)程主機通信 TcpClient client = myListener.EndAcceptTcpClient(ar); listBoxStatus.Invoke(setListBoxCallback,已接受客戶連接:+ client.Client.Remot

56、eEndPoint); comboBox1.Invoke(setComboBoxCallback, client.Client.RemoteEndPoint.ToString();ReadWriteObject readWriteObject = new ReadWriteObject(client); clientList.Add(readWriteObject);SendString(readWriteObject,服務(wù)器已經(jīng)接受連接,請通話!); readWriteOStream.BeginRead(readWriteObject.readBytes, 0, readWriteObjec

57、t.readBytes.Length, ReadCallback, readWriteObject); catch (Exception err) listBoxStatus.Invoke(setListBoxCallback, err.Message); return; private void ReadCallback(IAsyncResult ar) try ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState; int count = readWriteOStream.EndRead(ar); richText

58、BoxReceive.Invoke(setRichTextBoxCallback, string.Format(來自01”, readWriteObject.client.Client.RemoteEndPoint, System.Text.Encoding.UTF8.GetString(readWriteObject.readBytes, 0, count); if (isExit = false) 周瑞杰 TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計和實現(xiàn) 第23頁 共35頁 readWriteObject.InitReadArray(); readWriteOStream.BeginRead(re

59、adWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject); catch (Exception err) listBoxStatus.Invoke(setListBoxCallback, err.Message); private void SendString(ReadWriteObject readWriteObject, string str) try readWriteObject.writeBytes = System.Text.Encoding.UTF8.G

60、etBytes(str + rn); readWriteOStream.BeginWrite(readWriteObject.writeBytes, 0, readWriteObject.writeBytes.Length, new AsyncCallback(SendCallback), readWriteObject); readWriteOStream.Flush(); listBoxStatus.Invoke(setListBoxCallback, string.Format(向0發(fā)送:1”, readWriteObject.client.Client.RemoteEndPoint,

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論