資源描述:
《c# 20 套接字編程實例 udp tcp通信》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、不要想在一天那做完所有事情C#2.0套接字編程實例UDPTCP通信2010-04-0120:13by網(wǎng)絡(luò)金領(lǐng),293visits,網(wǎng)摘,收藏,編輯首先從原理上解釋一下采用Socket接口的網(wǎng)絡(luò)通訊,這里以最常用的C/S模式作為范例,首先,服務(wù)端有一個進(jìn)程(或多個進(jìn)程)在指定的端口等待客戶來連接,服務(wù)程序等待客戶的連接信息,一旦連接上之后,就可以按設(shè)計的數(shù)據(jù)交換方法和格式進(jìn)行數(shù)據(jù)傳輸??蛻舳嗽谛枰臅r刻發(fā)出向服務(wù)端的連接請求。這里為了便于理解,提到了一些調(diào)用及其大致的功能。使用socket調(diào)用后,僅產(chǎn)生了一個可以使用的socket描述符,這時還不能進(jìn)行通信,還要使用其他的調(diào)用,以使
2、得socket所指的結(jié)構(gòu)中使用的信息被填寫完?! ≡谑褂肨CP協(xié)議時,一般服務(wù)端進(jìn)程先使用socket調(diào)用得到一個描述符,然后使用bind調(diào)用將一個名字與socket描述符連接起來,對于Internet域就是將Internet地址聯(lián)編到socket。之后,服務(wù)端使用listen調(diào)用指出等待服務(wù)請求隊列的長度。然后就可以使用accept調(diào)用等待客戶端發(fā)起連接,一般是阻塞等待連接,一旦有客戶端發(fā)出連接,accept返回客戶的地址信息,并返回一個新的socket描述符,該描述符與原先的socket有相同的特性,這時服務(wù)端就可以使用這個新的socket進(jìn)行讀寫操作了。一般服務(wù)端可能在ac
3、cept返回后創(chuàng)建一個新的進(jìn)程進(jìn)行與客戶的通信,父進(jìn)程則再到accept調(diào)用處等待另一個連接??蛻舳诉M(jìn)程一般先使用socket調(diào)用得到一個socket描述符,然后使用connect向指定的服務(wù)器上的指定端口發(fā)起連接,一旦連接成功返回,就說明已經(jīng)建立了與服務(wù)器的連接,這時就可以通過socket描述符進(jìn)行讀寫操作了?! ?NetFrameWork為Socket通訊提供了System.Net.Socket命名空間,在這個命名空間里面有以下幾個常用的重要類分別是: ·Socket類這個低層的類用于管理連接,WebRequest,TcpClient和UdpClient在內(nèi)部使用這個類。
4、 ·NetworkStream類這個類是從Stream派生出來的,它表示來自網(wǎng)絡(luò)的數(shù)據(jù)流 ·TcpClient類允許創(chuàng)建和使用TCP連接 ·TcpListener類允許監(jiān)聽傳入的TCP連接請求 ·UdpClient類用于UDP客戶創(chuàng)建連接(UDP是另外一種TCP協(xié)議,但沒有得到廣泛的使用,主要用于本地網(wǎng)絡(luò)) 下面我們來看一個基于Socket的雙機(jī)通信代碼的C#版本 首先創(chuàng)建Socket對象的實例,這可以通過Socket類的構(gòu)造方法來實現(xiàn):publicSocket(AddressFamilyaddressFamily,SocketTypesocketType,Protoc
5、olTypeprotocolType); 其中,addressFamily參數(shù)指定Socket使用的尋址方案,socketType參數(shù)指定Socket的類型,protocolType參數(shù)指定Socket使用的協(xié)議。 下面的示例語句創(chuàng)建一個Socket,它可用于在基于TCP/IP的網(wǎng)絡(luò)(如Internet)上通訊。Sockettemp=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 若要使用UDP而不是TCP,需要更改協(xié)議類型,如下面的示例所示:Sockettemp=newSo
6、cket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); 一旦創(chuàng)建Socket,在客戶端,你將可以通過Connect方法連接到指定的服務(wù)器(你可以在Connect方法前Bind端口,就是以指定的端口發(fā)起連接,如果不事先Bind端口號的話,系統(tǒng)會默認(rèn)在1024到5000隨機(jī)綁定一個端口號),并通過Send方法向遠(yuǎn)程服務(wù)器發(fā)送數(shù)據(jù),而后可以通過Receive從服務(wù)端接收數(shù)據(jù);而在服務(wù)器端,你需要使用Bind方法綁定所指定的接口使Socket與一個本地終結(jié)點相聯(lián),并通過Listen方法偵聽該接口上的請求,當(dāng)
7、偵聽到用戶端的連接時,調(diào)用Accept完成連接的操作,創(chuàng)建新的Socket以處理傳入的連接請求。使用完Socket后,使用Close方法關(guān)閉Socket?! 】梢钥闯觯陨显S多方法包含EndPoint類型的參數(shù),在Internet中,TCP/IP使用一個網(wǎng)絡(luò)地址和一個服務(wù)端口號來唯一標(biāo)識設(shè)備。網(wǎng)絡(luò)地址標(biāo)識網(wǎng)絡(luò)上的特定設(shè)備;端口號標(biāo)識要連接到的該設(shè)備上的特定服務(wù)。網(wǎng)絡(luò)地址和服務(wù)端口的組合稱為終結(jié)點,在.NET框架中正是由EndPoint類表示這個終結(jié)點,它提供表示網(wǎng)絡(luò)資源或服務(wù)的抽