第10章-WCF和UDP應(yīng)用編程_第1頁(yè)
第10章-WCF和UDP應(yīng)用編程_第2頁(yè)
第10章-WCF和UDP應(yīng)用編程_第3頁(yè)
第10章-WCF和UDP應(yīng)用編程_第4頁(yè)
第10章-WCF和UDP應(yīng)用編程_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

工業(yè)和信息化部“十二五”規(guī)劃教材

普通高等學(xué)?!笆濉币?guī)劃教材

《C#網(wǎng)絡(luò)應(yīng)用編程》第3版

第10章WCF和UDP應(yīng)用編程2Ch10WCF和UDP應(yīng)用編程10.1UDP應(yīng)用編程概述10.2利用任務(wù)模型實(shí)現(xiàn)UDP應(yīng)用編程10.3利用WCF實(shí)現(xiàn)UDP應(yīng)用編程10.1UDP應(yīng)用編程概述10.1.1UDP基本知識(shí)10.1.2UDP應(yīng)用編程的技術(shù)選擇410.1.1UDP基本知識(shí)UDP(UserDatagramProtocol,用戶數(shù)據(jù)報(bào)協(xié)議)是簡(jiǎn)單的、面向數(shù)據(jù)報(bào)的無(wú)連接協(xié)議,提供了快速但不一定可靠的傳輸服務(wù)。UDP的主要作用是將網(wǎng)絡(luò)數(shù)據(jù)流量壓縮成數(shù)據(jù)報(bào)的形式,每一個(gè)數(shù)據(jù)報(bào)用8個(gè)字節(jié)描述報(bào)頭信息,剩余字節(jié)包含具體的傳輸數(shù)據(jù)。UDP特點(diǎn):(1)UDP可以一對(duì)多傳輸U(kuò)DP不但支持一對(duì)一通信,而且支持一對(duì)多通信。或者說(shuō),利用UDP可以使用多播技術(shù)同時(shí)向多個(gè)接收方發(fā)送信息。510.1.1UDP基本知識(shí)(2)UDP傳輸速度比TCP快由于UDP不需要先與對(duì)方建立連接,也不需要傳輸確認(rèn),因此其數(shù)據(jù)傳輸速度比TCP快得多。(3)UDP有消息邊界使用UDP不需要考慮消息邊界問(wèn)題。(4)UDP不保證有序傳輸U(kuò)DP不確保數(shù)據(jù)的發(fā)送順序和接收順序一致。對(duì)于突發(fā)性的數(shù)據(jù)報(bào),有可能會(huì)亂序。但是,這種亂序性基本上很少出現(xiàn),通常只會(huì)在網(wǎng)絡(luò)非常擁擠的情況下才有可能發(fā)生。(5)UDP可靠性不如TCPUDP不提供數(shù)據(jù)傳送的保證機(jī)制。10.1.1UDP基本知識(shí)2.單播、廣播和多播(1)單播單播是指只向某個(gè)指定的遠(yuǎn)程主機(jī)發(fā)送信息,這種方式本質(zhì)上屬于一對(duì)一的通信。(2)廣播廣播是指同時(shí)向子網(wǎng)中的多臺(tái)計(jì)算機(jī)發(fā)送消息,分為本地廣播和全球廣播。本地廣播是指向子網(wǎng)中的所有計(jì)算機(jī)發(fā)送廣播消息,其他網(wǎng)絡(luò)不會(huì)受到本地廣播的影響。全球廣播是指使用所有位全為1的IP地址(對(duì)于Ipv4來(lái)說(shuō)指55),但是,由于路由器默認(rèn)會(huì)自動(dòng)過(guò)濾掉全球廣播,所以使用這個(gè)地址沒(méi)有實(shí)際意義。10.1.1UDP基本知識(shí)IP地址分為兩部分,網(wǎng)絡(luò)標(biāo)識(shí)部分和主機(jī)標(biāo)識(shí)部分,這兩部分是靠子網(wǎng)掩碼來(lái)區(qū)分的,我們把主機(jī)標(biāo)識(shí)部分二進(jìn)制表示全部為1的地址稱為本地廣播地址。例如,對(duì)于B類網(wǎng)絡(luò),使用子網(wǎng)掩碼,則本地廣播地址是55,用二進(jìn)制表示為11000000.10101000.11111111.11111111。其中前兩個(gè)字節(jié)(網(wǎng)絡(luò)標(biāo)識(shí)部分)表示子網(wǎng)編號(hào),后兩個(gè)字節(jié)(主機(jī)標(biāo)識(shí)部分)全為1表示向該子網(wǎng)內(nèi)的所有用戶發(fā)送消息。仍以為例,如果子網(wǎng)掩碼為,則本地廣播地址是55。192.168.0為網(wǎng)絡(luò)標(biāo)識(shí)部分,255表示192.168.0子網(wǎng)中的所有主機(jī)。10.1.1UDP基本知識(shí)(3)多播(組播)多播也叫多路廣播,由于多播是分組的,所以也叫組播。對(duì)于IPv4來(lái)說(shuō),多播是指在到55的D類IP地址范圍內(nèi)進(jìn)行廣播(第1個(gè)字節(jié)在224~239之間)。或者說(shuō),發(fā)送方程序通過(guò)這些范圍內(nèi)的某個(gè)地址發(fā)送數(shù)據(jù),接收方程序也監(jiān)聽(tīng)并接收來(lái)自這些地址范圍的數(shù)據(jù)。10.1.2UDP應(yīng)用編程的技術(shù)選擇編寫(xiě)UDP應(yīng)用程序時(shí),可選擇以下技術(shù)。1.用Socket類實(shí)現(xiàn)第1種方式是直接用System.Net.Sockets命名空間下的Socket類來(lái)實(shí)現(xiàn)。采用這種方式時(shí),需要程序員編寫(xiě)的代碼最多,所有底層處理的細(xì)節(jié)都需要程序員自己去考慮。2.用UdpClient和多線程實(shí)現(xiàn)第2種方式是用System.Net.Sockets命名空間下的UdpClient類和Thread類來(lái)實(shí)現(xiàn)。UdpClient類對(duì)基礎(chǔ)Socket進(jìn)行了封裝,發(fā)送和接收數(shù)據(jù)時(shí)不必考慮套接字收發(fā)時(shí)必須處理的細(xì)節(jié)問(wèn)題,在一定程度上降低了用Socket編寫(xiě)UDP應(yīng)用程序的難度,提高了編程效率。10.1.2UDP應(yīng)用編程的技術(shù)選擇編寫(xiě)UDP應(yīng)用程序時(shí),可選擇以下技術(shù)。3.用UdpClient和多任務(wù)實(shí)現(xiàn)第3種方式是用UdpClient類以及基于任務(wù)的編程模型(Task類)來(lái)實(shí)現(xiàn)。用多任務(wù)實(shí)現(xiàn)比直接用多線程實(shí)現(xiàn)更有優(yōu)勢(shì)。4.用WCF實(shí)現(xiàn)第4種方式是用WCF來(lái)實(shí)現(xiàn)。即將WCF和UDP通過(guò)配置綁定在一起,這是對(duì)Socket進(jìn)行的另一種形式的封裝。10.2利用任務(wù)模型實(shí)現(xiàn)UDP應(yīng)用編程10.2.1利用UdpClient類發(fā)送和接收數(shù)據(jù)10.2.2利用UdpClient實(shí)現(xiàn)群發(fā)功能10.2.3利用UdpClient實(shí)現(xiàn)網(wǎng)絡(luò)會(huì)議討論10.2.1利用UdpClient類發(fā)送和接收數(shù)據(jù)System.Net.Sockets名稱空間下的UdpClient類對(duì)基礎(chǔ)套接字進(jìn)行了一定程度的封裝,同時(shí)還可以用它直接調(diào)用基礎(chǔ)套接字提供的功能。TCP有TcpListener類和TcpClient類,而UDP只有UdpClient類,這是因?yàn)閁DP是無(wú)連接的協(xié)議,所以只需要一種Socket。由于UDP不需要發(fā)送方和接收方先建立連接,因此發(fā)送方可以在任何時(shí)候直接向指定的遠(yuǎn)程主機(jī)發(fā)送UDP數(shù)據(jù)報(bào)。在這種模式中,發(fā)送方是客戶端,具有監(jiān)聽(tīng)功能的接收方是服務(wù)端。10.2.1利用UdpClient類發(fā)送和接收數(shù)據(jù)1.UdpClient類的常用構(gòu)造函數(shù)UdpClient類提供了多種重載的構(gòu)造函數(shù),分別用于IPv4和IPv6的數(shù)據(jù)收發(fā)。在這些構(gòu)造函數(shù)中,最常用的重載形式就是帶本地終結(jié)點(diǎn)參數(shù)的構(gòu)造函數(shù),語(yǔ)法如下。publicUdpClient(IPEndPointlocalEp)用這種構(gòu)造函數(shù)創(chuàng)建的UdpClient對(duì)象會(huì)自動(dòng)與參數(shù)中指定的本地終結(jié)點(diǎn)綁定在一起。綁定的目的是為了監(jiān)聽(tīng)來(lái)自其他遠(yuǎn)程主機(jī)的數(shù)據(jù)報(bào)。例如:IPEndPointlocalEndPoint=newIPEndPoint(localAddress,51666);UdpClientclient=newUdpClient(localEndPoint);10.2.1利用UdpClient類發(fā)送和接收數(shù)據(jù)2.同步發(fā)送和接收數(shù)據(jù)在同步阻塞方式下,可以用UdpClient對(duì)象的Send方法向遠(yuǎn)程主機(jī)發(fā)送數(shù)據(jù),用Receive方法接收來(lái)自遠(yuǎn)程主機(jī)的數(shù)據(jù)。(1)發(fā)送數(shù)據(jù)用UdpClient對(duì)象的Send方法同步發(fā)送數(shù)據(jù)時(shí),該方法返回已發(fā)送的字節(jié)數(shù)。Send方法有多種重載形式,這里只介紹最常用的重載形式,語(yǔ)法如下。publicintSend(byte[]data,intlength,IPEndPointremoteEndPoint)10.2.1利用UdpClient類發(fā)送和接收數(shù)據(jù)(2)接收數(shù)據(jù)UdpClient對(duì)象的Receive方法用于獲取來(lái)自遠(yuǎn)程主機(jī)的UDP數(shù)據(jù)報(bào),語(yǔ)法如下。publicbyte[]Receive(refIPEndPointremoteEndPoint)例如:Task.Run(()=>

{while(true)

{IPEndPointremote=null;byte[]bytes=client.Receive(refremote);

strings=Encoding.Unicode.GetString(bytes);}});10.2.1利用UdpClient類發(fā)送和接收數(shù)據(jù)2.異步發(fā)送和接收數(shù)據(jù)對(duì)于執(zhí)行時(shí)間可能較長(zhǎng)的任務(wù),或者無(wú)法預(yù)測(cè)用時(shí)到底有多長(zhǎng)的任務(wù),最好用基于任務(wù)的異步編程來(lái)實(shí)現(xiàn)(調(diào)用UdpClient對(duì)象的SendAsync方法和ReceiveAsync方法)。使用這種辦法的好處是收發(fā)數(shù)據(jù)時(shí),用戶界面不會(huì)出現(xiàn)停頓現(xiàn)象。異步發(fā)送數(shù)據(jù),例如:awaitclient.SendAsync(bytes,bytes.Length,remoteEndPoint);10.2.1利用UdpClient類發(fā)送和接收數(shù)據(jù)2.異步發(fā)送和接收數(shù)據(jù)異步接收數(shù)據(jù),例如:publicasyncvoidReceiveDataAsync(){while(true){varresult=awaitclient.ReceiveAsync();strings=Encoding.Unicode.GetString(result.Buffer);textBlock1.Dispatcher.Invoke(()=>{textBlock1.Text+=string.Format("來(lái)自{0}:{1}\n",result.RemoteEndPoint,s);

});}}10.2.1利用UdpClient類發(fā)送和接收數(shù)據(jù)3.基本用法示例【例10-1】演示用UdpClient收發(fā)數(shù)據(jù)的基本用法,運(yùn)行效果如圖10-1所示。10.2.2利用UdpClient實(shí)現(xiàn)群發(fā)功能1.加入和退出多播組多播組可以是永久的,也可以是臨時(shí)的。在實(shí)際應(yīng)用中,大多數(shù)多播組都是臨時(shí)的,即僅在多播組中有成員的時(shí)候才存在。凡是加入到多播組的接收端都可以接收來(lái)自多播發(fā)送端發(fā)送的數(shù)據(jù)。但是,如果不加入多播組,則無(wú)法接收多播數(shù)據(jù)。向多播組發(fā)送數(shù)據(jù)時(shí),需要先創(chuàng)建一個(gè)UdpClient對(duì)象。例如:UdpClientclient=newUdpClient("",8001);使用多播時(shí),應(yīng)注意的是該對(duì)象TTL值的設(shè)置。利用UdpClient對(duì)象的Ttl屬性可修改TTL的默認(rèn)值,例如:UdpClientudpClient=newUdpClient();udpClient.Ttl=50;10.2.2利用UdpClient實(shí)現(xiàn)群發(fā)功能(1)加入多播組利用UdpClient對(duì)象的JoinMulticastGroup方法可加入到指定的多播組中,例如://創(chuàng)建UdpClient的實(shí)例并設(shè)置本地監(jiān)聽(tīng)的端口號(hào)UdpClientudpClient=newUdpClient(8001);udpClient.JoinMulticastGroup(IPAddress.Parse(""));(2)退出多播組利用UdpClient的DropMulticastGroup方法可以退出多播組。參數(shù)中指出要退出多播組的IPAddress對(duì)象。例如:udpClient.DropMulticastGroup(IPAddress.Parse(""));10.2.2利用UdpClient實(shí)現(xiàn)群發(fā)功能2.是否允許接收多播利用UdpClient對(duì)象的MulticastLoopback屬性可控制是否允許接收多播信息。該屬性默認(rèn)為true,即允許接收多播。3.基本用法示例【例10-2】演示用UdpClient實(shí)現(xiàn)多播的基本用法,運(yùn)行效果如圖10-2所示。10.2.3利用UdpClient實(shí)現(xiàn)網(wǎng)絡(luò)會(huì)議討論【例10-3】演示用多播技術(shù)實(shí)現(xiàn)網(wǎng)絡(luò)會(huì)議討論的基本用法,運(yùn)行效果如圖10-3所示。10.2.3利用UdpClient實(shí)現(xiàn)網(wǎng)絡(luò)會(huì)議討論1.定義消息格式在這個(gè)例子中,消息由命令和參數(shù)兩大部分組成,命令與參數(shù)之間用逗號(hào)分隔。(1)Login,用戶名含義:用戶請(qǐng)求進(jìn)入會(huì)議室。(2)List,會(huì)議室現(xiàn)有人員列表含義:接收方收到List消息之后,將該用戶添加到“會(huì)議室現(xiàn)有成員”中。(3)Logout,用戶名含義:用戶請(qǐng)求退出會(huì)議室。(4)Say,用戶名,發(fā)言信息含義:與會(huì)人員發(fā)出的談話內(nèi)容。10.3利用WCF實(shí)現(xiàn)UDP應(yīng)用編程在面向服務(wù)的分布式應(yīng)用程序中,建議用WCF實(shí)現(xiàn)UDP應(yīng)用編程,而不是用傳統(tǒng)的技術(shù)去實(shí)現(xiàn)。WCF中與UDP相關(guān)的綁定只有<udpBinding>,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論