前一篇《Visual C#.Net網絡程序開發之Socket》中說到:支持Http、Tcp和Udp的類組成了TCP/IP三層模型(請求響應層、應用協議層、傳輸層)的中間層-應用協議層,該層的類比位於最底層的Socket類提供了更高層次的抽象,它們封裝 TCP 和 UDP 套接字的創建,不需要處理連接的細節,這使得我們在編寫套接字級別的協議時,可以更多地嘗試使用 TCPClient 、 UDPClient和TcpListener,而不是直接向 Socket 中寫。它們之間的這種層次關系示意如下:
可見,TcpClient 類基於 Socket 類構建,這是它能夠以更高的抽象程度提供 TCP 服務的基礎。正因為這樣,許多應用層上的通訊協議,比如FTP(File Transfers Protocol)文件傳輸協議、HTTP(Hypertext Transfers Protocol)超文本傳輸協議等都直接創建在TcpClient等類之上。
TCPClient 類使用 TCP 從 Internet 資源請求數據。TCP 協議建立與遠程終結點的連接,然後使用此連接發送和接收數據包。TCP 負責確保將數據包發送到終結點並在數據包到達時以正確的順序對其進行組合。
從名字上就可以看出,TcpClient類專為客戶端設計,它為 TCP 網絡服務提供客戶端連接。TcpClient 提供了通過網絡連接、發送和接收數據的簡單方法。
若要建立 TCP 連接,必須知道承載所需服務的網絡設備的地址(IPAddress)以及該服務用於通訊的 TCP 端口 (Port)。Internet 分配號碼機構 (Internet Assigned Numbers Authority, IANA) 定義公共服務的端口號(你可以訪問 http://www.iana.org/assignments/port-numbers獲得這方面更詳細的資料)。IANA 列表中所沒有的服務可使用 1,024 到 65,535 這一范圍中的端口號。要創建這種連接,你可以選用TcpClient類的三種構造函數之一:
1、public TcpClient()當使用這種不帶任何參數的構造函數時,將使用本機默認的ip地址並將使用默認的通信端口號0。這樣情況下,如果本機不止一個ip地址,將無法選擇使用。以下語句示例了如何使用默認構造函數來創建新的 TcpClient:
TcpClient tcpClientC = new TcpClient();
2、public TcpClient(IPEndPoint)使用本機IPEndPoint創建TcpClient的實例對象。上一篇介紹過了,IPEndPoint將網絡端點表示為IP地址和端口號,在這裡它用於指定在建立遠程主機連接時所使用的本地網絡接口(IP 地址)和端口號,這個構造方法為使用本機IPAddress和Port提供了選擇余地。下面的語句示例了如何使用本地終結點創建 TcpClient 類的實例:
IPHostEntry ipInfo=Dns.GetHostByName("www.tuha.net");//主機信息 IPAddressList[] ipList=ipInfo.AddressList;//IP地址數組 IPAddress ip=ipList[0];//多IP地址時一般用第一個 IPEndPoint ipEP=new IPEndPoint(ip,4088);//得到網絡終結點 try{ TcpClient tcpClientA = new TcpClient(ipLocalEndPoint); } catch (Exception e ) { Console.WriteLine(e.ToString()); }
到這裡,你可能會感到困惑,客戶端要和服務端創建連接,所指定的IP地址及通信端口號應該是遠程服務器的呀!事實上的確如此,使用以上兩種構造函數,你所實現的只是TcpClient實例對象與IP地址和Port端口的綁定,要完成連接,你還需要顯式指定與遠程主機的連接,這可以通過TcpClient類的Connect方法來實現, Connet方法使用指定的主機名和端口號將客戶端連接到 遠程主機:
1)、public void Connect(IPEndPoint); 使用指定的遠程網絡終結點將客戶端連接到遠程 TCP 主機。
public void Connect(IPAddress, int); 使用指定的 IP 地址和端口號將客戶端連接到 TCP 主機。
public void Connect(string, int); 將客戶端連接到指定主機上的指定端口。
需要指出的是,Connect方法的所有重載形式中的參數IPEndPoint網絡終結點、IPAddress以及表現為string的Dns主機名和int指出的Port端口均指的是遠程服務器。
以下示例語句使用主機默認IP和Port端口號0與遠程主機建立連接:
TcpClient tcpClient = new TcpClient();//創建TcpClient對象實例 try{ tcpClient.Connect("www.contoso.com",11002);//建立連接 } catch (Exception e ){ Console.WriteLine(e.ToString()); }
3、public TcpClient(string, int);初始化 TcpClient 類的新實例並連接到指定主機上的指定端口。與前兩個構造函數不一樣,這個構造函數將自動建立連接,你不再需要額外調用Connect方法,其中string類型的參數表示遠程主機的Dns名,如:www.tuha.net。