版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C#.Net網(wǎng)絡(luò)程序開(kāi)發(fā)-Socket篇Microsoft.NetFramework為應(yīng)用程序訪問(wèn)Internet提供了分層的、可擴(kuò)展的以及受管轄的網(wǎng)絡(luò)服務(wù),其名字空間System.Net和System.Net.Sockets包含豐富的類(lèi)可以開(kāi)發(fā)多種網(wǎng)絡(luò)應(yīng)用程序。.Net類(lèi)采用的分層結(jié)構(gòu)允許應(yīng)用程序在不同的控制級(jí)別上訪問(wèn)網(wǎng)絡(luò),開(kāi)發(fā)人員可以根據(jù)需要選擇針對(duì)不同的級(jí)別編制程序,這些級(jí)別兒乎囊括了Internet的所有需要-從socket套接字到普通的請(qǐng)求川臼應(yīng),更重要的是,這種分層是可以擴(kuò)展的,能夠適應(yīng)Internet不斷擴(kuò)展的需要。拋開(kāi)ISO/OSI模型的7層構(gòu)架,單從TCP/IP模型上的邏輯層
2、面上看,.Net類(lèi)可以視為包含3個(gè)層次:請(qǐng)求/響應(yīng)層、應(yīng)用協(xié)議層、傳輸層。WebReqeust和WebResponse代表了請(qǐng)求/響應(yīng)層,支持Http、Tcp和Udp的類(lèi)組成了應(yīng)用協(xié)議層,而Socket類(lèi)處于傳輸層。傳輸層位于這個(gè)結(jié)構(gòu)的最底層,為其上而的應(yīng)用協(xié)議層和請(qǐng)求/響應(yīng)層不能滿足應(yīng)用程序的特殊需要時(shí),就需要使用這一層進(jìn)行Socket套接字編程。而在.Net中,System.Net.Sockets命名空間為需要嚴(yán)密控制網(wǎng)絡(luò)訪問(wèn)的開(kāi)發(fā)人員提供了WindowsSockets(Winsock)接口的托管實(shí)現(xiàn)。System.Net命名空間中的所有貝他網(wǎng)絡(luò)訪問(wèn)類(lèi)都建立在該套接字Socket實(shí)現(xiàn)之上,
3、如TCPCIient.TCPListener和UDPCIient類(lèi)封裝有關(guān)創(chuàng)建到Internet的TCP和UDP連接的詳細(xì)信息;Networkstream類(lèi)則提供用于網(wǎng)絡(luò)訪問(wèn)的基礎(chǔ)數(shù)據(jù)流等,常見(jiàn)的許多Internet服務(wù)都可以見(jiàn)到Socket的蹤影,如Telnet.Http、Email.Echo等,這些服務(wù)盡管通訊協(xié)議Protocol的定義不同,但是其基礎(chǔ)的傳輸都是采用的Socketo其實(shí),Socket可以象流Stream-樣被視為一個(gè)數(shù)據(jù)通道,這個(gè)通道架設(shè)在應(yīng)用程序端(客戶端)和遠(yuǎn)程服務(wù)器端之間,而后,數(shù)據(jù)的讀?。ń邮眨┖蛯?xiě)入(發(fā)送)均針對(duì)這個(gè)通道來(lái)進(jìn)行??梢?jiàn),在應(yīng)用程序端或者服務(wù)器端創(chuàng)建了
4、Socket對(duì)象之后,就可以使用Send/SentTo方法將數(shù)據(jù)發(fā)送到連接的Socket,或者使用Receive/ReceiveFrom方法接收來(lái)自連接Socket的數(shù)據(jù);針對(duì)Socket編程,.NET框架的Socket類(lèi)是Winsock32API提供的套接字服務(wù)的托管代碼版本。其中為實(shí)現(xiàn)網(wǎng)絡(luò)編程提供了大量的方法,大多數(shù)悄況下,Socket類(lèi)方法只是將數(shù)據(jù)封送到它們的本機(jī)Win32副本中并處理任何必要的安全檢查。如果你熟悉WinsockAPI函數(shù),那么用Socket類(lèi)編寫(xiě)網(wǎng)絡(luò)程序會(huì)非常容易,半然,如果你不曾接觸過(guò),也不會(huì)太困難,跟隨下面的解說(shuō),你會(huì)發(fā)覺(jué)使用Socket類(lèi)開(kāi)發(fā)windows網(wǎng)絡(luò)應(yīng)
5、用程序原來(lái)有規(guī)可尋,它們?cè)诖蠖鄶?shù)悄況下遵循大致相同的步驟。在使用之前,你需要首先創(chuàng)建Socket對(duì)象的實(shí)例,這可以通過(guò)Socket類(lèi)的構(gòu)造方法來(lái)實(shí)現(xiàn):publicSocket(AddressFamilyaddressFamily.SocketTypesocketType.ProtocolTypeprotocolType);貝中,addressFamily參數(shù)指定Socket使用的尋址方案,socketType參數(shù)指定Socket的類(lèi)型,protocolType參數(shù)指定Socket使用的協(xié)議。下面的示例語(yǔ)句創(chuàng)建一個(gè)Socket,它可用于在基于TCP/IP的網(wǎng)絡(luò)(如Internet)上通訊。Soc
6、kets=newSocket(AddressFamilynterNetwork,SocketType.Stream,ProtocolType.Tcp);若要使用UDP而不是TCP,需要更改協(xié)議類(lèi)型,如下面的示例所示:Sockets=newSocket(AddressFamilynterNetwork,SocketType.Dgram,ProtocolType.Udp);一旦創(chuàng)建Socket,在客戶端,你將可以通過(guò)Connect方法連接到指定的服務(wù)器,并通過(guò)Send/SendT。方法向遠(yuǎn)程服務(wù)器發(fā)送數(shù)據(jù),而后可以通過(guò)Receive/ReceiveFrom從服務(wù)端接收數(shù)據(jù);而在服務(wù)器端,你需要使用
7、Bind方法綁定所指定的接口使Socket與一個(gè)本地終結(jié)點(diǎn)相聯(lián),并通過(guò)Listen方法偵聽(tīng)該接口上的請(qǐng)求,出偵聽(tīng)到用戶端的連接時(shí),調(diào)用Accept完成連接的操作,創(chuàng)建新的Socket以處理傳入的連接請(qǐng)求。使用完Socket后,記住使用Shutdown方法禁用Socket,并使用Close方法關(guān)閉Sockets其間用到的方法/函數(shù)有:Socket.Connect方法:建立到遠(yuǎn)程設(shè)備的連接publicvoidConnect(EndPointremoteEP)(有重載方法)Socket.Send方法:從數(shù)據(jù)中的指示位置開(kāi)始將數(shù)據(jù)發(fā)送到連接的Socket。publicintSend(byteO,int
8、,SocketFlags);(有重載方法)Socket.SendTo方法將數(shù)據(jù)發(fā)送到特定終結(jié)點(diǎn)。publicintSendTo(byteQ,EndPoint);(有重載方法)Socket.Receive方法:將數(shù)據(jù)從連接的Socket接收到接收緩沖區(qū)的特定位置。publicintReceive(byte,int,SocketFlags);Socket.ReceiveFrom方法:接收數(shù)據(jù)緩沖區(qū)中特定位置的數(shù)據(jù)并存儲(chǔ)終結(jié)點(diǎn)。publicintReceiveFrom(byte,int,SocketFlags,refEndPoint);Socket.Bind方法:使Socket與一個(gè)本地終結(jié)點(diǎn)相關(guān)聯(lián)
9、:publicvoidBind(EndPointlocalEP);Socket.Listen方法:將Socket置于偵聽(tīng)狀態(tài)。publicvoidListen(intbacklog);Socket.Accept方法:創(chuàng)建新的Socket以處理傳入的連接請(qǐng)求。publicSocketAccept();Socket.Shutdown方法:禁用某Socket上的發(fā)送和接收publicvoidShutdown(Socketshutdownhow);Socket.Close方法:強(qiáng)制Socket連接關(guān)閉publicvoidClose();可以看出,以上許多方法包含EndPoint類(lèi)型的參數(shù),在Inter
10、net中,TCP/IP使用一個(gè)網(wǎng)絡(luò)地址和一個(gè)服務(wù)端口號(hào)來(lái)唯一標(biāo)識(shí)設(shè)備。網(wǎng)絡(luò)地址標(biāo)識(shí)網(wǎng)絡(luò)上的特定設(shè)備;端口號(hào)標(biāo)識(shí)要連接到的該設(shè)備上的特定服務(wù)。網(wǎng)絡(luò)地址和服務(wù)端口的組合稱(chēng)為終結(jié)點(diǎn),在.NET框架中正是由EndPoint類(lèi)表示這個(gè)終結(jié)點(diǎn),它提供表示網(wǎng)絡(luò)資源或服務(wù)的抽象,用以標(biāo)志網(wǎng)絡(luò)地址等信息。.Net同時(shí)也為每個(gè)受支持的地址族定義了EndPoint的子代;對(duì)于IP地址族,該類(lèi)為IPEndPointoIPEndPoint類(lèi)包含應(yīng)用程序連接到主機(jī)上的服務(wù)所需的主機(jī)和端口信息,通過(guò)組合服務(wù)的主機(jī)IP地址和端口號(hào),IPEndPoint類(lèi)形成到服務(wù)的連接點(diǎn)。用到IPEndPoint類(lèi)的時(shí)候就不可避免地涉及到計(jì)
11、算機(jī)IP地址,.Net中有兩種類(lèi)可以得到IP地址實(shí)例:IPAddress類(lèi):IPAddress類(lèi)包含計(jì)算機(jī)在IP網(wǎng)絡(luò)上的地址。其Parse方法可將IP地址字符串轉(zhuǎn)換為IPAddress實(shí)例。下面的語(yǔ)句創(chuàng)建一個(gè)IPAddress實(shí)例:IPAddressmyIP=IPAddress.Parsef);Dns類(lèi):向使用TCP/IPInternet服務(wù)的應(yīng)用程序提供域名服務(wù)。其Resolve方法查詢(xún)DNS服務(wù)器以將用戶友好的域名(如“”)映射到數(shù)字形式的Internet地址(如)。Resolve方法返回一個(gè)IPHostEnty實(shí)例,該實(shí)例包含所請(qǐng)求名稱(chēng)的地址和別名的列表。大多數(shù)悄況下,可以使用Addre
12、ssList數(shù)組中返回的第一個(gè)地址。下面的代碼獲取一個(gè)IPAddress實(shí)例,該實(shí)例包含服務(wù)器的IP地址。IPHostEntryipHostlnfo=Dns.Resolve();IPAddressipAddress=ipHostInfo.AddressListO;你也可以使用GetHostName方法得到IPHostEntry實(shí)例:IPHosntEntryhostlnfo=Dns.GetHostByName()在使用以上方法時(shí),你將可能需要處理以下兒種異常:SocketException顯常:訪問(wèn)Socket時(shí)操作系統(tǒng)發(fā)生錯(cuò)誤引發(fā)ArgumentNullException異常:參數(shù)為空引用引發(fā)
13、ObjectDisposedException界常:Socket已經(jīng)關(guān)閉引發(fā)在掌握上面得知識(shí)后,下面的代碼將該服務(wù)器主機(jī)(的IP地址與端口號(hào)組合,以便為連接創(chuàng)建遠(yuǎn)程終結(jié)點(diǎn):IPEndPointipe=newIPEndPoint(ipAddressf11000);確定了遠(yuǎn)程設(shè)備的地址并選擇了用于連接的端口后,應(yīng)用程序可以嘗試建立與遠(yuǎn)程設(shè)備的連接。下而的示例使用現(xiàn)有的IPEndPoint實(shí)例與遠(yuǎn)程設(shè)備連接,并捕獲可能引發(fā)的異常:trys.Connect(ipe);/嘗試連接處理參數(shù)為空引用異常catch(ArgumentNullExceptionae)Console.WriteLine(HArgu
14、mentNullException:0,ae.ToString();處理操作系統(tǒng)界常catch(SocketExceptionse)Console.WriteLine(HSocketException:0nfse.ToString();catch(Exceptione)Console.WriteLine(HUnexpectedexception:0H,e.ToString();需要知道的是:Socket類(lèi)支持兩種某本模式:同步和片步。其區(qū)別在于:在同步模式中,對(duì)執(zhí)行網(wǎng)絡(luò)操作的函數(shù)(如Send和Receive)的調(diào)用一直等到操作完成后才將控制返回給調(diào)用程序。在異步模式中,這些調(diào)用立即返回。另外,
15、很多時(shí)候,Socket編程視悄況不同需要在客戶端和服務(wù)器端分別予以實(shí)現(xiàn),在客戶端編制應(yīng)用程序向服務(wù)端指定端口發(fā)送請(qǐng)求,同時(shí)編制服務(wù)端應(yīng)用程序處理該請(qǐng)求,這個(gè)過(guò)程在上面的闡述中已經(jīng)提及;當(dāng)然,并非所有的Socket編程都需要你嚴(yán)格編寫(xiě)這兩端程序;視應(yīng)用悄況不同,你可以在客戶端構(gòu)造出請(qǐng)求字符串,服務(wù)器相應(yīng)端口捕獲這個(gè)請(qǐng)求,交由其公用服務(wù)程序進(jìn)行處理。以下事例語(yǔ)句中的字符串就向遠(yuǎn)程主機(jī)提出頁(yè)面請(qǐng)求:stringGet=GET/HTTP/1.1rnHost:+server+WConnection:Closernrn;遠(yuǎn)程主機(jī)指定端口接受到這一請(qǐng)求后,就可利用貝公用服務(wù)程序進(jìn)行處理而不需要另行編制服務(wù)器
16、端應(yīng)用程序。綜合運(yùn)用以上闡述的使用VisualC#進(jìn)行Socket網(wǎng)絡(luò)程序開(kāi)發(fā)的知識(shí),下面的程序段完整地實(shí)現(xiàn)了Web頁(yè)面下載功能。用戶只需在窗體上輸入遠(yuǎn)程主機(jī)名(Dns主機(jī)名或以點(diǎn)分隔的四部分表示法格式的IP地址)和預(yù)保存的本地文件名,并利用專(zhuān)門(mén)提供Http服務(wù)的80端口,就可以獲取遠(yuǎn)程主機(jī)頁(yè)面并保存在本地機(jī)指定文件中。如果保存格式S.htm格式,你就可以在Internet瀏覽器中打開(kāi)該頁(yè)面。適半添加代碼,你其至可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的瀏覽器程序。實(shí)現(xiàn)此功能的主要源代碼如下:/“開(kāi)始按鈕事件privatevoidbutton1_Click(objectsender,System.EventArgse
17、)/取得預(yù)保存的文件石stringfileName=textBox3.Text.Trim();遠(yuǎn)程主機(jī)stringhostName=textBox1.Text.Trim();端口intport=lnt32.Parse(textBox2.Text.Trim();得到主機(jī)信息IPHostEntryiplnfo=Dns.GetHostByName(hostName);取得IPAddressOIPAddressipAddr=iplnfo.AddressList;得到ipIPAddressip=ipAddrO;組合出遠(yuǎn)程終結(jié)點(diǎn)IPEndPointhostEP=newIPEndPoint(ip,port)
18、;創(chuàng)建Socket實(shí)例Socketsocket二newSocket(AddressFamilynterNetwork,SocketType.Stream,ProtocolType.Tcp);try嘗試連接socket.Connect(hostEP);catch(Exceptionse)MessageBox.Show(u連接錯(cuò)誤n+se.Message;1提示信息,MessageBoxButtons.RetryCancel,MessageBoxlconnformat!on);發(fā)送給遠(yuǎn)程主機(jī)的請(qǐng)求內(nèi)容串stringsendStr=GET/HTTP/1.1rnHost:+hostName+HrnCo
19、nnection:ClosernrnH;創(chuàng)建bytes字節(jié)數(shù)組以轉(zhuǎn)換發(fā)送串bytebytesSendStr=newbyte1024;將發(fā)送內(nèi)容字符串轉(zhuǎn)換成字節(jié)byte數(shù)組bytesSendStr=Encoding.ASCII.GetBytes(sendStr);try向主機(jī)發(fā)送請(qǐng)求socket.Send(bytesSendStr,bytesSendStr.Length,0);catch(Exceptionce)MessageBox.Show(u發(fā)送錯(cuò)誤:”+ce.MessageJ提示信息,MessageBoxButtons.RetryCancel,MessageBoxlcorulnformat!on);聲明接收返回內(nèi)容的字
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 塔吊安裝施工協(xié)議
- 電影節(jié)套房租賃協(xié)議
- 商場(chǎng)防火門(mén)安裝合同定案
- 數(shù)字創(chuàng)意產(chǎn)業(yè)園租賃合同
- 劇院舞臺(tái)植物布置租賃合同
- 石家莊市工業(yè)園區(qū)租賃合同
- 宿舍樓消防設(shè)施維護(hù)合同
- 城市安全防范工程安裝協(xié)議
- 紙張供需合同范例
- 模具加工訂制合同范例
- 第三章熱分析
- “小學(xué)數(shù)學(xué)概念教學(xué)”課題研究
- 視神經(jīng)炎專(zhuān)家共識(shí)PPT醫(yī)學(xué)課件
- word中表格的使用(課堂PPT)
- 變電站電氣工程質(zhì)量監(jiān)理旁站點(diǎn)及旁站監(jiān)理記錄
- 流動(dòng)資金缺口測(cè)算表
- 混凝土結(jié)構(gòu)設(shè)計(jì)原理課程設(shè)計(jì)
- 成績(jī)加權(quán)平均分計(jì)算器
- 鈑金件質(zhì)量檢驗(yàn)報(bào)告單
- 航空集裝器知識(shí)完整版
- 減速器箱體工藝工裝設(shè)計(jì)說(shuō)明書(shū)(含圖紙)
評(píng)論
0/150
提交評(píng)論