程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#網絡編程概述(2)

C#網絡編程概述(2)

編輯:C#入門知識

IPEndPoint類:

在Internet中,TCP/IP使用一個網絡地址和一個服務端口號來唯一標識設備。網絡地址標識網絡上的特定設備;端口號標識要連接到的該設備上的特定服務。網絡地址和服務端口的組合稱為終結點,在.NET框架中正是由EndPoint類表示這個終結點,它提供表示網絡資源或服務的抽象,用以標志網絡地址等信息。.Net同時也為每個受支持的地址族定義了 EndPoint的子代;對於IP地址族,該類為IPEndPoint。IPEndPoint類包含應用程序連接到主機上的服務所需的主機和端口信息,通過組合服務的主機IP地址和端口號,IPEndPoint類形成到服務的連接點。

在IPEndPoint類中有兩個很有用的構造函數:

public IPEndPoint(long, int);

public IPEndPoint(IPAddress, int);

它們的作用就是用指定的地址和端口號初始化 IPEndPoint 類的新實例。該類中的屬性有:Address屬性、AddressFamily屬性以及Port屬性,這些屬性相對比較容易理解,這裡就不作多介紹。下面的代碼顯示了如何取得服務器www.google.com的終結點:

IPHostEntry IPHost = Dns.Resolve("www.google.com");

IPAddress[] addr = IPHost.AddressList;

IPEndPoint ep = new IPEndPoint(addr[0],80);

這樣,我們已經了解了和主機取得連接的一些必要的基本類,有了這些知識,我們就可以運用下面的Socket類真正地和主機取得連接並進行通訊了。

Socket類:

Socket類是包含在System.Net.Sockets名字空間中的一個非常重要的類。一個Socket實例包含了一個本地以及一個遠程的終結點,就像上面介紹的那樣,該終結點包含了該Socket實例的一些相關信息。

需要知道的是Socket 類支持兩種基本模式:同步和異步。其區別在於:在同步模式中,對執行網絡操作的函數(如Send和Receive)的調用一直等到操作完成後才將控制返回給調用程序。在異步模式中,這些調用立即返回。

下面我們重點討論同步模式的Socket編程。首先,同步模式的Socket編程的基本過程如下:

1. 創建一個Socket實例對象。

2. 將上述實例對象連接到一個具體的終結點(EndPoint)。

3. 連接完畢,就可以和服務器進行通訊:接收並發送信息。

4. 通訊完畢,用ShutDown()方法來禁用Socket。

5. 最後用Close()方法來關閉Socket。

知道了以上基本過程,我們就開始進一步實現連接並通訊了。在使用之前,你需要首先創建Socket對象的實例,這可以通過Socket類的構造方法來實現:

public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);

其中,addressFamily 參數指定Socket使用的尋址方案,比如AddressFamily.InterNetwork表明為IP版本4的地址;socketType參數指定Socket的類型,比如SocketType.Stream表明連接是基於流套接字的,而SocketType.Dgram表示連接是基於數據報套接字的。protocolType參數指定Socket使用的協議,比如ProtocolType.Tcp表明連接協議是運用TCP協議的,而Protocol.Udp則表明連接協議是運用UDP協議的。


 

在創建了Socket實例後,我們就可以通過一個遠程主機的終結點和它取得連接,運用的方法就是Connect()方法:

public Connect (EndPoint ep);

該方法只可以被運用在客戶端。進行連接後,我們可以運用套接字的Connected屬性來驗證連接是否成功。如果返回的值為true,則表示連接成功,否則就是失敗。下面的代碼就顯示了如何創建Socket實例並通過終結點與之取得連接的過程:

IPHostEntry IPHost = Dns.Resolve("http://www.google.com/");

string []aliases = IPHost.Aliases;

IPAddress[] addr = IPHost.AddressList;

EndPoint ep = new IPEndPoint(addr[0],80);

Socket sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

sock.Connect(ep);

if(sock.Connected)

Console.WriteLine("OK");

一旦連接成功,我們就可以運用Send()和Receive()方法來進行通訊。

Send()方法的函數原型如下:

public int Send (byte[] buffer, int size, SocketFlags flags);

其中,參數buffer包含了要發送的數據,參數size表示要發送數據的大小,而參數flags則可以是以下一些值:SocketFlags.None、SocketFlags.DontRoute、SocketFlags.OutOfBnd。

該方法返回的是一個System.Int32類型的值,它表明了已發送數據的大小。同時,該方法還有以下幾種已被重載了的函數實現:

public int Send (byte[] buffer);

public int Send (byte[] buffer, SocketFlags flags);

public int Send (byte[] buffer,int offset, int size, SocketFlags flags);

介紹完Send()方法,下面是Receive()方法,其函數原型如下:

public int Receive(byte[] buffer, int size, SocketFlags flags);

其中的參數和Send()方法的參數類似,在這裡就不再贅述。

同樣,該方法還有以下一些已被重載了的函數實現:

public int Receive (byte[] buffer);

public int Receive (byte[] buffer, SocketFlags flags);

public int Receive (byte[] buffer,int offset, int size, SocketFlags flags);


在通訊完成後,我們就通過ShutDown()方法來禁用Socket,函數原型如下:

public void ShutDown(SocketShutdown how);

其中的參數how表明了禁用的類型,SoketShutdown.Send表明關閉用於發送的套接字;SoketShutdown.Receive表明關閉用於接收的套接字;而SoketShutdown.Both則表明發送和接收的套接字同時被關閉。

應該注意的是在調用Close()方法以前必須調用ShutDown()方法以確保在Socket關閉之前已發送或接收所有掛起的數據。一旦ShutDown()調用完畢,就調用Close()方法來關閉Socket,其函數原型如下:

public void Close();

該方法強制關閉一個Socket連接並釋放所有托管資源和非托管資源。該方法在內部其實是調用了方法Dispose(),該函數是受保護類型的,其函數原型如下:

protected virtual void Dispose(bool disposing);

其中,參數disposing為true或是false,如果為true,則同時釋放托管資源和非托管資源;如果為false,則僅釋放非托管資源。因為Close()方法調用Dispose()方法時的參數是true,所以它釋放了所有托管資源和非托管資源。

這樣,一個Socket從創建到連接到通訊最後的關閉的過程就完成了。雖然整個過程比較復雜,但相對以前在SDK或是其他環境下進行Socket編程,這個過程就顯得相當輕松了。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved