第八章 網(wǎng)絡程序設計_第1頁
第八章 網(wǎng)絡程序設計_第2頁
第八章 網(wǎng)絡程序設計_第3頁
第八章 網(wǎng)絡程序設計_第4頁
第八章 網(wǎng)絡程序設計_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、版權(quán)所有1第八章第八章 網(wǎng)絡程序設計網(wǎng)絡程序設計在分布式應用程序中,基于客戶端和服務器的各種網(wǎng)絡編程序技術應用非常廣泛。C#對網(wǎng)絡程序設計提供了強大的支持,在System.Net命名空間中包含了許多用于網(wǎng)絡程序設計的類。 版權(quán)所有2目錄l 網(wǎng)絡程序設計基礎l 面向連接的套接字l 面向無連接的套接字 版權(quán)所有38.1 網(wǎng)絡程序設計基礎 System.Net命名空間為當前網(wǎng)絡上使用的多種協(xié)議提供了簡單的編程接口。 8.1.1 網(wǎng)絡協(xié)議 網(wǎng)絡協(xié)議是網(wǎng)絡上計算機為交換數(shù)據(jù)所必須遵守的通信規(guī)范和消息格式的集合。目前常用的網(wǎng)絡協(xié)議有TCP協(xié)議和UDP協(xié)議。版權(quán)所有4 1.TCP協(xié)議協(xié)議 TCP是Tranf

2、er Control Protocol的簡稱,是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過TCP協(xié)議傳輸,得到的是一個順序的無差錯的數(shù)據(jù)流。發(fā)送方和接收方的成對的兩個Socket之間必須建立連接,以便在TCP協(xié)議的基礎上進行通信,當一個Socket(通常都是Server Socket)等待建立連接時,另一個Socket可以請求連接,一旦這兩個Socket連接起來,它們就可以進行雙向數(shù)據(jù)傳輸,雙方都可以進行發(fā)送或接收操作。版權(quán)所有5 2.UDP協(xié)議協(xié)議 UDP是User Datagram Protocol的簡稱,是一種無連接的協(xié)議,每個數(shù)據(jù)報都是一個獨立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡上

3、以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內(nèi)容的正確性都是不能被保證的。 使用UDP時,每個數(shù)據(jù)報中都給出了完整的地址信息,因此無需要建立發(fā)送方和接收方的連接。使用TCP協(xié)議,由于它是一個面向連接的協(xié)議,在Socket之間進行數(shù)據(jù)傳輸之前必然要建立連接,所以在TCP中多了一個連接建立的時間。 版權(quán)所有6 8.1.2 有關的概念1IP地址地址標識計算機等網(wǎng)絡設備的網(wǎng)絡地址,由四個8位的二進制數(shù)組成,中間以小數(shù)點分隔。如: , 02主機名主機名(hostname)網(wǎng)絡地址的助記名,按照域名進行分級管理。如: 版權(quán)所有73端

4、口號端口號(port number)網(wǎng)絡通信時同一機器上的不同進程的標識。如: 80,21,23,25,其中11024為系統(tǒng)保留的端口號4服務類型服務類型(service)網(wǎng)絡的各種服務。如:http, telnet, ftp, smtp5協(xié)議名(協(xié)議名(protocol)指明獲取資源所使用的傳輸協(xié)議,如:http、ftp、gopher、file 版權(quán)所有8 6資源名(資源名(resourceName) 是資源的完整地址,包括主機名、端口號、文件名或文件內(nèi)部的一個引用。例如:http:/ 協(xié)議名:/主機名http:/ 協(xié)議名:/機器名文件名 在Internet上,IP地址和主機名是一一對應的,

5、通過域名解析可以由主機名得到機器的IP,由于機器名更接近自然語言,容易記憶,所以使用比IP地址廣泛,但是對機器而言只有IP地址才是有效的標識符。版權(quán)所有9 8.1.3 IPAddress和IPEndPoint類 在System.Net命名空間中,有兩個專門用于處理各種類型的IP地址信息的類型:IPAddress類和IPEndPoint類。 1.IPAddress類類 IPAddress類用于表示一個IP地址,一般使用Parse方法創(chuàng)建IPAddress的實例。 IPAddress ip=IPAddress.Parse(); IPAddress類還提供了4個只讀屬性,分別代

6、表程序中使用的特殊IP地址: (1)Any:代表本地系統(tǒng)可用的任何IP地址。 (2)Broadcast:代表本地網(wǎng)絡的IP 廣播地址。 (3)Loopback:代表系統(tǒng)的回送地址。 (4)None:代表系統(tǒng)上沒有網(wǎng)絡接口。 在System.Net命名空間下,包含有一個Dns類,可以利用該類的GetHostName()方法找到本地系統(tǒng)的主機名,然后再用GetHostByName()找到主機的IP地址。 版權(quán)所有10 2.IPEndPoint類類 IPEndPoint對象用于表示指定的IP地址/端口的組合。其構(gòu)造函數(shù)為: IPEndPoint(IpAddress address,int port)

7、; 該類有幾個常用的屬性: (1)Address:得到或者設置IP地址。 (2)AddressFamily: 獲取網(wǎng)際協(xié)議 (IP) 地址族。 (3)Port: 獲取或設置終結(jié)點的 TCP 端口號. 版權(quán)所有11 8.1.4 套接字(Socket)System.Net.Sockets命名空間包含了一個Socket類,它是最基礎的網(wǎng)絡編程序接口。Socket類的構(gòu)造函數(shù)為:public Socket( AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);addressFamily 參數(shù)指定S

8、ocket 使用的尋址方案,socketType 參數(shù)指定Socket 的類型,protocolType 參數(shù)指定 Socket 使用的協(xié)議。對于網(wǎng)絡上的IP通信來說,addressFamily總是使用AddressFamily.InterNetwork枚舉值。 版權(quán)所有12版權(quán)所有13 與Socket相關的操作: (1)接受請求Socket Accept(); /創(chuàng)建一個套接字來處理到來的連接請求。(2)綁定地址void Bind(IPEndPoint localEP); /使 Socket與一個本地終結(jié)點相關聯(lián)。如果需要使用特定的本地終結(jié)點,請使用Bind()方法。必須先調(diào)用Bind(),

9、然后才能調(diào)用Listen()方法。如果不介意分配哪個本地地址,則可以用 IPAddress.Any作為地址參數(shù)創(chuàng)建一個 IPEndPoint,這樣,基礎服務提供程序?qū)峙渥钸m合的網(wǎng)絡地址。 版權(quán)所有14(3)建立連接void Connect(IPEndPoint ip);用來與遠程服務器建立連接。連接之后,可以用Send()發(fā)送數(shù)據(jù)或用Receive()函數(shù)接收數(shù)據(jù)。(4)監(jiān)聽請求void Listen(int backlog);/backlog指定隊列中最多可容納的等待接受的傳入連接數(shù)。設置套接字處于監(jiān)聽狀態(tài)。當數(shù)據(jù)到達某個端口時,它會向主機發(fā)送通知消息。 版權(quán)所有15(5)發(fā)送數(shù)據(jù)使用S

10、end()或SendTo()方法。int Send(byte buffer);int SendTo(byte buffer,IPEndPoint remoteIP);/向指定的地址發(fā)送數(shù)據(jù)發(fā)送數(shù)據(jù)還可以使用NetWorkStream對象。創(chuàng)建NetWorkStream對象的方法是:NetWorkStream netstream=new NetWrokStream(clientSocket);String message=“發(fā)送的信息”;Byte b=System.Text.Encoding.Unicode.GetBytes(message);netstream.Write(b,0,b.Leng

11、th); 版權(quán)所有16(6)接受數(shù)據(jù)使用Receive()或ReceiveFrom()接收數(shù)據(jù)。int Receive(byte buffer);int Receive(byte buffer,ref IPEndPoint ip)(7)關閉 使用Shutdown()關閉套接字。public void Shutdown( SocketShutdown how); how指定不再允許執(zhí)行的操作, 版權(quán)所有17版權(quán)所有18 8.1.5 網(wǎng)絡流(NetworkStream) NetworkStream類提供用于網(wǎng)絡訪問的基礎數(shù)據(jù)流。它提供了在阻塞模式下通過 Stream套接字發(fā)送和接收數(shù)據(jù)的方法。要創(chuàng)

12、建NetworkStream,必須提供連接的Socket。也可指定 NetworkStream 對所提供的Socket具有哪些FileAccess權(quán)限。默認情況下,關閉 NetworkStream 并不會關閉所提供的Socket。如果要使 NetworkStream 擁有關閉所提供的 Socket 的權(quán)限,則必須將ownsSocket構(gòu)造函數(shù)參數(shù)的值指定為 true。 該類的Write()和Read()方法用于簡單的單線程同步阻塞 I/O。若要使用不同的線程來處理I/O,則請考慮使用BeginWrite()/ EndWrite()和BeginRead()/ EndRead()方法進行通信。 版

13、權(quán)所有191NetworkStream的構(gòu)造函數(shù)的構(gòu)造函數(shù)(1)public NetworkStream(Socket):為指定的Socket創(chuàng)建 NetworkStream類的新實例。(2)public NetworkStream(Socket, bool):用指定的Socket所屬權(quán)為指定的Socket初始化 NetworkStream 類的新實例。(3)public NetworkStream(Socket, FileAccess):用指定的訪問權(quán)限為指定的Socket創(chuàng)建 NetworkStream類的新實例。(4)public NetworkStream(Socket, FileAc

14、cess, bool):用指定的訪問權(quán)限和指定的Socket所屬權(quán)為指定的Socket創(chuàng)建 NetworkStream類的新實例。2NetworkStream類的主要成員類的主要成員 版權(quán)所有208.2 面向連接的套接字 IP連接領域有兩種通信類型:面向連接的和無連接的。在面向連接的套接字中,使用TCP協(xié)議來建立兩個IP地址端點之間的會話。一旦建立了這種連接,就可以在設備之間可靠地傳輸數(shù)據(jù)。在使用套接字通信過程中主動發(fā)起通信的一方被稱為客戶端,接受請求進行通信的一方稱為服務器。為了建立面向連接的套接字,服務器和客戶端必須分別進行編程。版權(quán)所有21 8.2.1 面向連接的套接字程序基本結(jié)構(gòu)面向連

15、接的套接字程序基本結(jié)構(gòu) 版權(quán)所有221服務器端程序的基本結(jié)構(gòu)服務器端程序的基本結(jié)構(gòu)(1)建立套接字。(2)將套接字綁定到用于TCP通信的本地IP地址和端口上。(3)設置套接字處于監(jiān)聽狀態(tài)。(4)等待用戶請求。(5)有用戶請求,可以發(fā)送數(shù)據(jù)或接受數(shù)據(jù)。(6)關閉套接字。 版權(quán)所有232. 客戶端程序的基本結(jié)構(gòu)客戶端程序的基本結(jié)構(gòu)(1)建立套接字。(2)與服務器進行連接。(3)發(fā)送或接受數(shù)據(jù)。(4)關閉套接字。 版權(quán)所有24 【案例案例8-1】一個簡單TCP/IP客戶/服務器程序。 本案例建立一個控制臺程序,服務器程序啟動后,等待客戶連接,客戶程序啟動后主動與服務器連接,連接成功服務器向客戶端發(fā)送

16、信息“連接成功!”,客戶端接到信息后向服務器發(fā)送信息“服務器你好”,服務器再向客戶端發(fā)送信息“客戶你好“。運行界面如圖8-2所示,(a)為服務器,(b)為客戶端。 版權(quán)所有25 8.2.2 使用同步套接字 在通過Socket進行連接、接收、發(fā)送操作時,客戶機或服務器會暫停當前工作,處于等待狀態(tài),即一直等有數(shù)據(jù)時才繼續(xù)執(zhí)行下面的語句。一般在阻塞方式下使用這種方式??梢?,同步套接字適用于網(wǎng)絡傳輸量不大的情況。當網(wǎng)絡傳輸量很大時,長時間的等待可能回讓用戶無法忍受,這時需要使用異步套接字。 版權(quán)所有26 【案例案例8-2】使用同步套接字。 本案例創(chuàng)建一個接收來自客戶端的連接請求的服務器。該服務器是用同

17、步套接字生成的,因此在等待來自客戶端的連接時掛起服務器應用程序的執(zhí)行。該應用程序接收來自客戶端的字符串,在控制臺顯示該字符串,然后將該字符串回顯到客戶端。來自客戶端的字符串必須包含字符串“”,以發(fā)出表示消息結(jié)尾的信號??蛻舳耸怯猛教捉幼稚傻?,因此掛起客戶端應用程序的執(zhí)行,直到服務器返回響應為止。該應用程序?qū)⒆址l(fā)送到服務器,然后在控制臺顯示該服務器返回的字符串。運行界面如圖8-3所示,(a)為服務器,(b)為客戶端。 版權(quán)所有27 8.2.3 使用TcpListener和TcpClient 在System.Net.Sockets.命名空間下,有兩個專門用于TCP協(xié)議編程的類:TCPCli

18、ent和TCPListener類。這兩個類提供了直觀的容易使用的屬性和方法,從而降低了TCP協(xié)議編程的難度。版權(quán)所有28 1. TcpListener類類 TcpListener 類提供一些簡單方法,用于在阻塞同步模式下偵聽和接受傳入連接請求??蛻舳耸褂肨cpClient或Socket來連接TcpListener??墒褂肐PEndPoint、本地 IP 地址及端口號或者僅使用端口號,來創(chuàng)建 TcpListener??梢詫⒈镜?IP 地址指定為 Any,將本地端口號指定為 0(如果希望基礎服務提供程序為您分配這些值)。如果選擇這樣做,可使用 LocalEndpoint來標識已指定的信息。 版權(quán)所

19、有29 Start()方法用來開始偵聽傳入的連接請求。Start() 將對傳入連接進行排隊,直至您調(diào)用 Stop()方法或它已經(jīng)完成MaxConnections排隊為止??墒褂肁cceptSocket() 或 AcceptTcpClient()從傳入連接請求隊列提取連接。這兩種方法將阻塞。如果要避免阻塞,可首先使用 Pending()方法來確定隊列中是否有可用的連接請求。調(diào)用Stop()方法來關閉 TcpListener。版權(quán)所有30 2. TcpClient類類 TcpClient類為 TCP 網(wǎng)絡服務提供客戶端連接。TcpClient 類提供了一些簡單的方法,用于在同步阻塞模式下通過網(wǎng)絡來

20、連接、發(fā)送和接收流數(shù)據(jù)。 為使TcpClient連接并交換數(shù)據(jù),使用 TCP 創(chuàng)建的 TcpListener或 Socket必須偵聽是否有傳入的連接請求??梢允褂孟旅鎯煞N方法之一連接到該偵聽器: (1)創(chuàng)建一個TcpClient,并調(diào)用三個可用的Connect方法之一。 public void Connect(IPEndPoint):使用指定的遠程網(wǎng)絡終結(jié)點將客戶端連接到遠程 TCP 主機。 public void Connect(IPAddress, int):使用指定的 IP 地址和端口號將客戶端連接到 TCP 主機。 public void Connect(string, int):將客

21、戶端連接到指定主機上的指定端口。 版權(quán)所有31(2)使用遠程主機的主機名和端口號創(chuàng)建TcpClient。此構(gòu)造函數(shù)將自動嘗試一個連接。 要發(fā)送和接收數(shù)據(jù),請使用 GetStream()方法來獲取一個NetworkStream。調(diào)用 NetworkStream的Write()和Read()方法與遠程主機之間發(fā)送和接收數(shù)據(jù)。使用 Close()方法釋放與TcpClient 關聯(lián)的所有資源。 版權(quán)所有32 【案例案例8-3】簡單的聊天程序。 本案例設計一個Windows應用程序,能夠?qū)崿F(xiàn)客戶與服務器的一對一聊天??蛻舳撕头斩说慕缑嬖O計基本相似。窗體上有2個文本框和2個按鈕。用于顯示信息的文本框的M

22、ultiline屬性設為True。 版權(quán)所有33 8.2.4 使用異步套接字 同步套接字在監(jiān)聽時處于暫停狀態(tài),而異步套接字可以在監(jiān)聽的同時進行其他操作。.NET提供了一種稱為AsyncCallback的委托,該委托允許啟動異步的功能,并在異步功能結(jié)束后執(zhí)行委托提供的方法。版權(quán)所有341異步套接字服務器程序異步套接字服務器程序異步套接字服務器需要一個開始接受網(wǎng)絡連接請求的方法,一個處理連接請求并開始接收網(wǎng)絡數(shù)據(jù)的回調(diào)方法以及一個結(jié)束接收數(shù)據(jù)的回調(diào)方法。程序結(jié)構(gòu)如下:(1)建立Socket。(2)將套接字綁定到用于TCP通信的本地IP地址和端口上。(3)設置套接字處于監(jiān)聽狀態(tài)。 版權(quán)所有35(4)

23、使用BeginAccept 方法開始接受新連接。它負責獲取將處理連接的 Socket 實例,并將 Socket 提交給將處理請求的線程。 public IasyncResult BeginAccept(AsyncCallback callback,Object state);第一參數(shù)為AsyncCallback類型的委托,利用此參數(shù)關聯(lián)一個回調(diào)方法。第二個參數(shù)為Object類型,用于將狀態(tài)信息傳遞給委托提供的方法。(5)設計回調(diào)方法。 執(zhí)行BeginAccept方法時不會停下來等待客戶端連接,而是繼續(xù)往下執(zhí)行。同時BeginAccept也繼續(xù)執(zhí)行,一旦BeginAccept接收到新的客戶端連接

24、,AsyncCallback委托就會自動調(diào)用回調(diào)方法。在回調(diào)方法中,通過IasyncResult類型的參數(shù)獲得狀態(tài)信息,并調(diào)用EndAccept方法完成接受請求。版權(quán)所有36(6)在回調(diào)方法中調(diào)用BeginReceiive方法接收數(shù)據(jù)或調(diào)用BeginSend()發(fā)送數(shù)據(jù)。這兩個方法都有6個參數(shù): 參數(shù)1:緩沖區(qū)(字節(jié)數(shù)組)。 參數(shù)2:開始發(fā)送或接收的位置。 參數(shù)3:發(fā)送或接收的字節(jié)數(shù)。 參數(shù)4:SocketFlags值的按位組合。 參數(shù)5:異步回調(diào)函數(shù)。 參數(shù)6:表示狀態(tài)的對象。(7)完成發(fā)送后,在回調(diào)方法中調(diào)用EndSend完成本次發(fā)送。版權(quán)所有372異步套接字客戶端程序異步套接字客戶端程序

25、 客戶端程序與服務器端程序有很多共同點。主要注意:在異步套接字編程中,客戶端必須使用BeginConnect方法連接到遠程主機,其格式為:IAsyncResult BeginConnect(EndPoint ep,AsyncCallBack callback,Object state);其中第一個參數(shù)是遠程主機的EndPoint對象;第二個參數(shù)用于和遠程主機連接成功后執(zhí)行委托的方法;最后一個參數(shù)是狀態(tài)對象,用于傳遞必要的數(shù)據(jù)。 版權(quán)所有38 【案例案例8-4】基于異步套接字的聊天程序。 本案例與案例8-3功能基本類似,單采用了異步套接字技術。 版權(quán)所有398.3 面向無連接的套接字面向無連接的

26、套接字 UDP協(xié)議使用無連接的套接字,無連接的套接字不需要在網(wǎng)絡設備之間發(fā)送連接信息。因此,通信的兩端基本上是對等的,很難確定誰是服務器誰是客戶機。我們不妨把先發(fā)送信息的一端看成客戶端,先接受數(shù)據(jù)的一端看成是服務器。很難確定誰是服務器誰是客戶機。建立面向無連接的套接字編程。 版權(quán)所有40 8.3.1 面向無連接的套接字程序基本結(jié)構(gòu)面向無連接的套接字程序基本結(jié)構(gòu) 版權(quán)所有411服務器端程序的結(jié)構(gòu)服務器端程序的結(jié)構(gòu)(1)建立套接字。(2)將套接字綁定到用于UDP通信的本地IP地址和端口上。(3)用ReceiveFrom()方法接收數(shù)據(jù)。(4)用SendTo()方法發(fā)送數(shù)據(jù)。(5)關閉套接字。 版權(quán)所有422客戶端程序的結(jié)構(gòu)客戶端程序的結(jié)構(gòu)(1)建立套接字。(2)將套接字綁定到用于UDP通信的本地IP地址和端口上。(3)用SendTo()方法發(fā)送數(shù)據(jù)。(4)用ReceiveFrom()方法接收數(shù)據(jù)。(5)關閉套接字。 版權(quán)所有43 8.3.2與面向連接的套接字的主要區(qū)別與面向連接的套接字的主要區(qū)別(1)建立Socket時指定的協(xié)議為SocketType為SocketType.Dgram,ProtocolType為ProtocolType.UDP協(xié)議。IPAddress ipAddress =IPAddress.Parse(); IPEndPoint

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論