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

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、范要求課程設(shè)計(jì)論文的質(zhì)量指導(dǎo)教師對(duì)課程設(shè)計(jì)的評(píng)定意見TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計(jì)和實(shí)現(xiàn)學(xué)生:周瑞杰指導(dǎo)老師:王靜摘要:在TCP/IP協(xié)議族中,傳輸層主要包括TCP和UDP兩種通信協(xié)議,它們以 不同的方式實(shí)現(xiàn)兩臺(tái)主機(jī)中的不同程序間之間的數(shù)據(jù)傳輸,即數(shù)據(jù)的端到端傳 輸。TCP提供一種面向連接的、可靠的數(shù)據(jù)傳輸服務(wù),保證了端到端數(shù)據(jù)傳輸?shù)?可靠性;而UDP提供一種無連接的、不可靠的數(shù)據(jù)傳輸方式,但保證了數(shù)據(jù)傳輸 的實(shí)時(shí)性。本課程設(shè)計(jì)用C#語言分別編寫了基于TCP的C/S聊天程序和基于UDP 的C/S聊天程序。經(jīng)測(cè)試,本文程序基本實(shí)現(xiàn)了聊天功能,即實(shí)現(xiàn)了 TCP和UDP數(shù) 據(jù)包發(fā)送程序的設(shè)計(jì)。關(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è)計(jì)的目的11.2本設(shè)計(jì)任務(wù)和主要內(nèi)容12開發(fā)工具及相關(guān)技術(shù)2 HYPERLINK l bookmark32 o Current Document 2.1。#簡(jiǎn)介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è)計(jì)6 HYPERLINK l bookmark62 o Current Document TCP設(shè)計(jì)思路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è)計(jì)11 HYPERLINK l bookmark80 o Cur

9、rent Document UDP設(shè)計(jì)思路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聊天程序運(yùn)行結(jié)果14UDP聊天程序運(yùn)行結(jié)果175.3結(jié)果分析176結(jié)束語187參考文獻(xiàn)19附錄1: TCP源程序清單20附錄2: UDP源程序清單33

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

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

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

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

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

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

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

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

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

19、Server端來實(shí)現(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)用都可以進(jìn)行同樣的業(yè)務(wù)處 理,應(yīng)用不同的模塊共享邏輯組件;因此,內(nèi)部的和外部的用戶都可以訪問新的 和現(xiàn)有的應(yīng)用系統(tǒng),通過現(xiàn)有應(yīng)用系統(tǒng)中的邏輯可以擴(kuò)展出新的應(yīng)用系統(tǒng)。這也 就是目前應(yīng)用系統(tǒng)的發(fā)展方向。C/S工作過程如下:服務(wù)器端描述:S端啟動(dòng)服務(wù)進(jìn)程,并監(jiān)聽相應(yīng)端口。然后,若收到C端發(fā) 出的有關(guān)請(qǐng)求,按如下情況給出相應(yīng)的反映:將收到的包進(jìn)行檢測(cè),若收到的包 有錯(cuò)則拋棄(discard),并發(fā)給C

20、端一個(gè)negtive ACK。若收到的包正常,則將此 包進(jìn)行解包,將內(nèi)容輸出至一臨時(shí)文件;并發(fā)給C端一個(gè)positive ACK。依次收 到來自C端的包,直到收到end為止,并關(guān)閉此進(jì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ā)一個(gè)End包,直接關(guān)閉此進(jìn)程。綜上所述,應(yīng)用中的服務(wù)器程序必須先于客戶機(jī)進(jìn)程啟動(dòng),直到對(duì)客戶機(jī)的 響應(yīng)結(jié)束或強(qiáng)迫終止。3基于TCP的C/S聊天程序的詳細(xì)設(shè)計(jì)3.1 TCP設(shè)計(jì)思路為了簡(jiǎn)化編程,.NET提供面向TCP編程的相

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

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

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

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

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

26、listBoxStatus.Invoke(setListBoxCallback, string.Format( 本機(jī) EndPoint : 0,client.Client.LocalEndPoint);listBoxStatus.Invoke(setListBoxCallback, 開始與服務(wù)器建立連接);與遠(yuǎn)程主機(jī)連接成功后,利用NetworkStream實(shí)例發(fā)送和接收數(shù)據(jù)。該方法 首先通過client.GetStream來返回NetWorkStream實(shí)例,進(jìn)而利用所獲取的 NetworkStream實(shí)例的讀寫方法Write 和 Read來發(fā)送和接收數(shù)據(jù),其實(shí)現(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完成后,會(huì)自動(dòng)調(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ù)器端編程步驟新建一個(gè)服務(wù)器端窗口程序:FormServer對(duì)窗口程序進(jìn)行界面設(shè)計(jì),由于功能比較簡(jiǎn)單,并沒有做做到盡善盡美, 只是做到簡(jiǎn)單的通信與顯示信息,主要用到了三

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

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

31、的連接請(qǐng)求,并返回一個(gè)TcpClient實(shí)例以接受客戶的連接請(qǐng)求,如下面代碼所示:private void AcceptTcpClientCallback(IAsyncResult ar)(try(將事件狀態(tài)設(shè)為終止?fàn)顟B(tài),允許一個(gè)或多個(gè)等待線程繼續(xù) allDone.Set();TcpListener myListener = (TcpListener)ar.AsyncState;異步接收傳入的連接,創(chuàng)建新的TcpClient對(duì)象處理遠(yuǎn)程主機(jī)通信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)接受連接,請(qǐng)通話! );由于返回的是TcpClient實(shí)例,所以可以通過對(duì)Ne

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

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

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

36、目保存路徑,單擊【確定】按鈕。然后在項(xiàng)目中編寫 程序。首先需要引入命名空間:using System.Net;using System.Net.Sockets;在編寫客戶端程序時(shí),創(chuàng)建UDPClient實(shí)例并指定連接信息后,就開始設(shè)計(jì) 數(shù)據(jù)的發(fā)送和接收,使用send方法來完成數(shù)據(jù)發(fā)送操作。其中核心代碼如下面 所示:設(shè)置服務(wù)IP,設(shè)置TCP端口號(hào)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ā)送的第一個(gè)數(shù)據(jù)包string welcome = Hello!;data = Encoding.ASCII.GetBytes(welcome);/在指定了連接信息后,直接給出數(shù)據(jù)及其長(zhǎng)度進(jìn)行發(fā)送server.SendTo(data, data.Length, SocketFlags.None, ipep);/將UDP數(shù)據(jù)報(bào)發(fā)送到指定的主機(jī)上的指定端口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 方法來實(shí)現(xiàn)。43服務(wù)器端編程步驟啟動(dòng)Visual Studio2008,選擇【文件】I【新建】I【項(xiàng)目】命令,彈出【新建 項(xiàng)目】對(duì)話框,在左側(cè)【項(xiàng)目類型】列表中選擇【Visual C#,在右側(cè)【模板】 列表框中選擇【控制臺(tái)應(yīng)用程序】,在【名稱】文本框中輸入“UDPServer” , 在【位置】文本框中

39、輸入與客戶端相同的保存路徑,單擊【確定】按鈕。然后在 項(xiàng)目中編寫程序。同樣的,在服務(wù)器端編程時(shí)也需要引入如下命名空間:using System.Net;using System.Net.Sockets;整個(gè)程序的核心代碼如下構(gòu)建TCP服務(wù)器IPEndPoint ipep = new IPEndPoint(IPAddress.Any 8001);/得到本機(jī)IP,設(shè)置TCP端口號(hào)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)試和運(yùn)行,就可以實(shí)現(xiàn)簡(jiǎn)單的通 信了,結(jié)果將在后面部分進(jìn)行分析。5結(jié)果分析51 TCP聊天程序運(yùn)行結(jié)果初始界面如下所示:服務(wù)器端首先“開始監(jiān)聽”,客戶端打開“連

41、接”按鈕,服務(wù)器端監(jiān)聽到客戶端的鏈接請(qǐng)求后,會(huì)顯示下面的的結(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)聽到客戶端的連接請(qǐng)求情況圖客戶端和服務(wù)器端進(jìn)行連接后,可以進(jìn)行正常的聊天了??蛻舳伺c服務(wù)器端通話情況如下圖所示:囿異步TCP喋天服務(wù)器端狀態(tài)信息開始等待客戶連接已接受客戶連接:10. 11. 13.238:1721開珈等待客口連捂向38:1721發(fā)送:服務(wù)器已經(jīng)接受連接,請(qǐng)通話?向10. 11. 13. 238:

42、1花1發(fā)送:你好10. 11. 13.238:1721:送:很木錯(cuò)?開始監(jiān)聽停止監(jiān)聽接收的信息來自10. 11. 13.238:1721你好,我是周瑞杰來自10. 11. 13.238:1721這是一個(gè)基于TCF的聊天程序準(zhǔn)備發(fā)送的信息圖5-5實(shí)現(xiàn)通信后的服務(wù)器端界面圖接收方:38:1721發(fā)送52 UDP聊天程序運(yùn)行結(jié)果運(yùn)行程序后,初始界面如下: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ù)器端和客戶端實(shí)現(xiàn)成功的連接。根據(jù)客 戶端和服務(wù)器端的通信狀況可知,所設(shè)計(jì)的聊天程序符合要求,達(dá)到了預(yù)期的目 標(biāo)。本次課程設(shè)計(jì)是利用C#編寫的,經(jīng)過這兩周的學(xué)習(xí),我受益匪淺。首先, 我復(fù)習(xí)了之前學(xué)的C#網(wǎng)絡(luò)編程知識(shí),弄懂了 C#編程的方法和規(guī)則。其次,更加 全面的了解并掌握TCP和UDP這兩個(gè)網(wǎng)絡(luò)層協(xié)議的概念和工作原理。本次課程設(shè) 計(jì)分別實(shí)現(xiàn)了一個(gè)TCP的C/S聊天程序和一個(gè)UDP的C/S聊天程序。從一點(diǎn)點(diǎn)思 想到流

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

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

47、能:用#實(shí)現(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),使用手動(dòng)重置方式private EventWaitHandle allDone =new EventWaitHandle(false, EventResetMode.ManualReset);public FormServer()InitializeComponent();/構(gòu)造函數(shù),初始化時(shí)會(huì)執(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ù)器要為多個(gè)客戶服務(wù),所以需要?jiǎng)?chuàng)建一個(gè)線程監(jiān)聽客戶端連接請(qǐng)求ThreadStart ts = new ThreadStart(AcceptConnect);/創(chuàng)建連接Thread myThread = new Thread(ts);創(chuàng)建線程myThread.Start();/啟動(dòng)線程buttonStart.Enabled = false;buttonStop.Enabled = true;private void AcceptConnect()/獲取本機(jī)所有IP地址IPAddress ip = Dns.GetHostAddresses(Dns.

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

54、ener.BeginAcceptTcpClient(callback, listener);/阻塞當(dāng)前線程,直到收到客戶連接信號(hào)allDone.WaitOne();catch (Exception err)listBoxStatus.Invoke(setListBoxCallback, err.Message); 將#周瑞杰 TCP和UDP數(shù)據(jù)包發(fā)送程序的設(shè)計(jì)和實(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),允許一個(gè)或多個(gè)等待線程繼續(xù) allDone.Set(); TcpListener myListener = (TcpListener)ar.AsyncState; 異步接收傳入的連接,并創(chuàng)建新的TcpClient對(duì)象處理遠(yuǎn)程主機(jī)通信 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)接受連接,請(qǐ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è)計(jì)和實(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論