版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C#.Net網(wǎng)絡(luò)程序開發(fā)-Socket篇Microsoft.NetFramework為應(yīng)用程序訪問Internet提供了分層的、可擴(kuò)展的以及受管轄的網(wǎng)絡(luò)服務(wù),其名字空間System.Net和System.Net.Sockets包含豐富的類可以開發(fā)多種網(wǎng)絡(luò)應(yīng)用程序。.Net類采用的分層結(jié)構(gòu)允許應(yīng)用程序在不同的控制級別上訪問網(wǎng)絡(luò),開發(fā)人員可以根據(jù)需要選擇針對不同的級別編制程序,這些級別兒乎囊括了Internet的所有需要-從socket套接字到普通的請求川臼應(yīng),更重要的是,這種分層是可以擴(kuò)展的,能夠適應(yīng)Internet不斷擴(kuò)展的需要。拋開ISO/OSI模型的7層構(gòu)架,單從TCP/IP模型上的邏輯層
2、面上看,.Net類可以視為包含3個層次:請求/響應(yīng)層、應(yīng)用協(xié)議層、傳輸層。WebReqeust和WebResponse代表了請求/響應(yīng)層,支持Http、Tcp和Udp的類組成了應(yīng)用協(xié)議層,而Socket類處于傳輸層。傳輸層位于這個結(jié)構(gòu)的最底層,為其上而的應(yīng)用協(xié)議層和請求/響應(yīng)層不能滿足應(yīng)用程序的特殊需要時,就需要使用這一層進(jìn)行Socket套接字編程。而在.Net中,System.Net.Sockets命名空間為需要嚴(yán)密控制網(wǎng)絡(luò)訪問的開發(fā)人員提供了WindowsSockets(Winsock)接口的托管實現(xiàn)。System.Net命名空間中的所有貝他網(wǎng)絡(luò)訪問類都建立在該套接字Socket實現(xiàn)之上,
3、如TCPCIient.TCPListener和UDPCIient類封裝有關(guān)創(chuàng)建到Internet的TCP和UDP連接的詳細(xì)信息;Networkstream類則提供用于網(wǎng)絡(luò)訪問的基礎(chǔ)數(shù)據(jù)流等,常見的許多Internet服務(wù)都可以見到Socket的蹤影,如Telnet.Http、Email.Echo等,這些服務(wù)盡管通訊協(xié)議Protocol的定義不同,但是其基礎(chǔ)的傳輸都是采用的Socketo其實,Socket可以象流Stream-樣被視為一個數(shù)據(jù)通道,這個通道架設(shè)在應(yīng)用程序端(客戶端)和遠(yuǎn)程服務(wù)器端之間,而后,數(shù)據(jù)的讀?。ń邮眨┖蛯懭耄òl(fā)送)均針對這個通道來進(jìn)行。可見,在應(yīng)用程序端或者服務(wù)器端創(chuàng)建了
4、Socket對象之后,就可以使用Send/SentTo方法將數(shù)據(jù)發(fā)送到連接的Socket,或者使用Receive/ReceiveFrom方法接收來自連接Socket的數(shù)據(jù);針對Socket編程,.NET框架的Socket類是Winsock32API提供的套接字服務(wù)的托管代碼版本。其中為實現(xiàn)網(wǎng)絡(luò)編程提供了大量的方法,大多數(shù)悄況下,Socket類方法只是將數(shù)據(jù)封送到它們的本機(jī)Win32副本中并處理任何必要的安全檢查。如果你熟悉WinsockAPI函數(shù),那么用Socket類編寫網(wǎng)絡(luò)程序會非常容易,半然,如果你不曾接觸過,也不會太困難,跟隨下面的解說,你會發(fā)覺使用Socket類開發(fā)windows網(wǎng)絡(luò)應(yīng)
5、用程序原來有規(guī)可尋,它們在大多數(shù)悄況下遵循大致相同的步驟。在使用之前,你需要首先創(chuàng)建Socket對象的實例,這可以通過Socket類的構(gòu)造方法來實現(xiàn):publicSocket(AddressFamilyaddressFamily.SocketTypesocketType.ProtocolTypeprotocolType);貝中,addressFamily參數(shù)指定Socket使用的尋址方案,socketType參數(shù)指定Socket的類型,protocolType參數(shù)指定Socket使用的協(xié)議。下面的示例語句創(chuàng)建一個Socket,它可用于在基于TCP/IP的網(wǎng)絡(luò)(如Internet)上通訊。Soc
6、kets=newSocket(AddressFamilynterNetwork,SocketType.Stream,ProtocolType.Tcp);若要使用UDP而不是TCP,需要更改協(xié)議類型,如下面的示例所示:Sockets=newSocket(AddressFamilynterNetwork,SocketType.Dgram,ProtocolType.Udp);一旦創(chuàng)建Socket,在客戶端,你將可以通過Connect方法連接到指定的服務(wù)器,并通過Send/SendT。方法向遠(yuǎn)程服務(wù)器發(fā)送數(shù)據(jù),而后可以通過Receive/ReceiveFrom從服務(wù)端接收數(shù)據(jù);而在服務(wù)器端,你需要使用
7、Bind方法綁定所指定的接口使Socket與一個本地終結(jié)點相聯(lián),并通過Listen方法偵聽該接口上的請求,出偵聽到用戶端的連接時,調(diào)用Accept完成連接的操作,創(chuàng)建新的Socket以處理傳入的連接請求。使用完Socket后,記住使用Shutdown方法禁用Socket,并使用Close方法關(guān)閉Sockets其間用到的方法/函數(shù)有:Socket.Connect方法:建立到遠(yuǎn)程設(shè)備的連接publicvoidConnect(EndPointremoteEP)(有重載方法)Socket.Send方法:從數(shù)據(jù)中的指示位置開始將數(shù)據(jù)發(fā)送到連接的Socket。publicintSend(byteO,int
8、,SocketFlags);(有重載方法)Socket.SendTo方法將數(shù)據(jù)發(fā)送到特定終結(jié)點。publicintSendTo(byteQ,EndPoint);(有重載方法)Socket.Receive方法:將數(shù)據(jù)從連接的Socket接收到接收緩沖區(qū)的特定位置。publicintReceive(byte,int,SocketFlags);Socket.ReceiveFrom方法:接收數(shù)據(jù)緩沖區(qū)中特定位置的數(shù)據(jù)并存儲終結(jié)點。publicintReceiveFrom(byte,int,SocketFlags,refEndPoint);Socket.Bind方法:使Socket與一個本地終結(jié)點相關(guān)聯(lián)
9、:publicvoidBind(EndPointlocalEP);Socket.Listen方法:將Socket置于偵聽狀態(tài)。publicvoidListen(intbacklog);Socket.Accept方法:創(chuàng)建新的Socket以處理傳入的連接請求。publicSocketAccept();Socket.Shutdown方法:禁用某Socket上的發(fā)送和接收publicvoidShutdown(Socketshutdownhow);Socket.Close方法:強(qiáng)制Socket連接關(guān)閉publicvoidClose();可以看出,以上許多方法包含EndPoint類型的參數(shù),在Inter
10、net中,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ù)的抽象,用以標(biāo)志網(wǎng)絡(luò)地址等信息。.Net同時也為每個受支持的地址族定義了EndPoint的子代;對于IP地址族,該類為IPEndPointoIPEndPoint類包含應(yīng)用程序連接到主機(jī)上的服務(wù)所需的主機(jī)和端口信息,通過組合服務(wù)的主機(jī)IP地址和端口號,IPEndPoint類形成到服務(wù)的連接點。用到IPEndPoint類的時候就不可避免地涉及到計
11、算機(jī)IP地址,.Net中有兩種類可以得到IP地址實例:IPAddress類:IPAddress類包含計算機(jī)在IP網(wǎng)絡(luò)上的地址。其Parse方法可將IP地址字符串轉(zhuǎn)換為IPAddress實例。下面的語句創(chuàng)建一個IPAddress實例:IPAddressmyIP=IPAddress.Parsef);Dns類:向使用TCP/IPInternet服務(wù)的應(yīng)用程序提供域名服務(wù)。其Resolve方法查詢DNS服務(wù)器以將用戶友好的域名(如“”)映射到數(shù)字形式的Internet地址(如)。Resolve方法返回一個IPHostEnty實例,該實例包含所請求名稱的地址和別名的列表。大多數(shù)悄況下,可以使用Addre
12、ssList數(shù)組中返回的第一個地址。下面的代碼獲取一個IPAddress實例,該實例包含服務(wù)器的IP地址。IPHostEntryipHostlnfo=Dns.Resolve();IPAddressipAddress=ipHostInfo.AddressListO;你也可以使用GetHostName方法得到IPHostEntry實例:IPHosntEntryhostlnfo=Dns.GetHostByName()在使用以上方法時,你將可能需要處理以下兒種異常:SocketException顯常:訪問Socket時操作系統(tǒng)發(fā)生錯誤引發(fā)ArgumentNullException異常:參數(shù)為空引用引發(fā)
13、ObjectDisposedException界常:Socket已經(jīng)關(guān)閉引發(fā)在掌握上面得知識后,下面的代碼將該服務(wù)器主機(jī)(的IP地址與端口號組合,以便為連接創(chuàng)建遠(yuǎn)程終結(jié)點:IPEndPointipe=newIPEndPoint(ipAddressf11000);確定了遠(yuǎn)程設(shè)備的地址并選擇了用于連接的端口后,應(yīng)用程序可以嘗試建立與遠(yuǎn)程設(shè)備的連接。下而的示例使用現(xiàn)有的IPEndPoint實例與遠(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類支持兩種某本模式:同步和片步。其區(qū)別在于:在同步模式中,對執(zhí)行網(wǎng)絡(luò)操作的函數(shù)(如Send和Receive)的調(diào)用一直等到操作完成后才將控制返回給調(diào)用程序。在異步模式中,這些調(diào)用立即返回。另外,
15、很多時候,Socket編程視悄況不同需要在客戶端和服務(wù)器端分別予以實現(xiàn),在客戶端編制應(yīng)用程序向服務(wù)端指定端口發(fā)送請求,同時編制服務(wù)端應(yīng)用程序處理該請求,這個過程在上面的闡述中已經(jīng)提及;當(dāng)然,并非所有的Socket編程都需要你嚴(yán)格編寫這兩端程序;視應(yīng)用悄況不同,你可以在客戶端構(gòu)造出請求字符串,服務(wù)器相應(yīng)端口捕獲這個請求,交由其公用服務(wù)程序進(jìn)行處理。以下事例語句中的字符串就向遠(yuǎn)程主機(jī)提出頁面請求:stringGet=GET/HTTP/1.1rnHost:+server+WConnection:Closernrn;遠(yuǎn)程主機(jī)指定端口接受到這一請求后,就可利用貝公用服務(wù)程序進(jìn)行處理而不需要另行編制服務(wù)器
16、端應(yīng)用程序。綜合運用以上闡述的使用VisualC#進(jìn)行Socket網(wǎng)絡(luò)程序開發(fā)的知識,下面的程序段完整地實現(xiàn)了Web頁面下載功能。用戶只需在窗體上輸入遠(yuǎn)程主機(jī)名(Dns主機(jī)名或以點分隔的四部分表示法格式的IP地址)和預(yù)保存的本地文件名,并利用專門提供Http服務(wù)的80端口,就可以獲取遠(yuǎn)程主機(jī)頁面并保存在本地機(jī)指定文件中。如果保存格式S.htm格式,你就可以在Internet瀏覽器中打開該頁面。適半添加代碼,你其至可以實現(xiàn)一個簡單的瀏覽器程序。實現(xiàn)此功能的主要源代碼如下:/“開始按鈕事件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é)點IPEndPointhostEP=newIPEndPoint(ip,port)
18、;創(chuàng)建Socket實例Socketsocket二newSocket(AddressFamilynterNetwork,SocketType.Stream,ProtocolType.Tcp);try嘗試連接socket.Connect(hostEP);catch(Exceptionse)MessageBox.Show(u連接錯誤n+se.Message;1提示信息,MessageBoxButtons.RetryCancel,MessageBoxlconnformat!on);發(fā)送給遠(yuǎn)程主機(jī)的請求內(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ā)送請求socket.Send(bytesSendStr,bytesSendStr.Length,0);catch(Exceptionce)MessageBox.Show(u發(fā)送錯誤:”+ce.MessageJ提示信息,MessageBoxButtons.RetryCancel,MessageBoxlcorulnformat!on);聲明接收返回內(nèi)容的字
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 肇慶學(xué)院《管理會計模擬實驗》2023-2024學(xué)年第一學(xué)期期末試卷
- 企業(yè)員工績效質(zhì)量個人貢獻(xiàn)度評價體系
- 保險行業(yè)投資分析模板
- 20XX年度績效總結(jié)模板
- 房地產(chǎn)經(jīng)紀(jì)操作實務(wù)-2019年房地產(chǎn)經(jīng)紀(jì)人協(xié)理《房地產(chǎn)經(jīng)紀(jì)操作實務(wù)》真題匯編
- 人資行政崗位述職報告模板
- 有關(guān)保護(hù)環(huán)境的調(diào)查報告
- 二零二五版帶利息支付的商業(yè)匯票貼現(xiàn)合同樣本3篇
- 陜西省西安市部分學(xué)校2024-2025學(xué)年高一上學(xué)期第四次階段性檢測化學(xué)試卷(含答案)
- 二零二五年度高速公路鋼筋材料供應(yīng)協(xié)議3篇
- 《形勢與政策》課程標(biāo)準(zhǔn)
- 2023年海南省公務(wù)員錄用考試《行測》真題卷及答案解析
- 橋梁監(jiān)測監(jiān)控實施方案
- 消防控制室值班人員崗位職責(zé)-五項制度
- 鋼結(jié)構(gòu)安裝施工培訓(xùn)
- 2024至2030年中國抗菌藥數(shù)據(jù)監(jiān)測研究報告
- 太平洋保險在線測評題
- 珠寶玉石居間合同范本
- 青少年人工智能編程水平測試二級-模擬真題01含答案
- 仁愛英語八年級下冊Unit-5-Topic-2單元測試
- DZ∕T 0291-2015 飾面石材礦產(chǎn)地質(zhì)勘查規(guī)范
評論
0/150
提交評論