程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#網絡編程(基本概念和操作) - Part.1(5)

C#網絡編程(基本概念和操作) - Part.1(5)

編輯:關於C語言

2.客戶端與服務端連接

2.1單一客戶端與服務端連接

當服務器開始對端口偵聽之後,便可以創建客戶端與它建立連接。這一步是通過在客戶端創建一個 TcpClient的類型實例完成。每創建一個新的TcpClIEnt便相當於創建了一個新的套接字Socket去與服務端 通信,.Net會自動為這個套接字分配一個端口號,上面說過,TcpClient類不過是對Socket進行了一個包 裝。創建TcpClIEnt類型實例時,可以在構造函數中指定遠程服務器的地址和端口號。這樣在創建的同時 ,就會向遠程服務端發送一個連接請求(“握手”),一旦成功,則兩者間的連接就建立起來了。也可以 使用重載的無參數構造函數創建對象,然後再調用Connect()方法,在Connect()方法中傳入遠程服務器地 址和端口號,來與服務器建立連接。

這裡需要注意的是,不管是使用有參數的構造函數與服務器連接,或者是通過Connect()方法與服務器 建立連接,都是同步方法(或者說是阻塞的,英文叫block)。它的意思是說,客戶端在與服務端連接成 功、從而方法返回,或者是服務端不存、從而拋出異常之前,是無法繼續進行後繼操作的。這裡還有一個 名為BeginConnect()的方法,用於實施異步的連接,這樣程序不會被阻塞,可以立即執行後面的操作,這 是因為可能由於網絡擁塞等問題,連接需要較長時間才能完成。網絡編程中有非常多的異步操作,凡事都 是由簡入難,關於異步操作,我們後面再討論,現在只看同步操作。

創建一個新的控制台應用程序項目,命名為ClIEntConsole,它是我們的客戶端,然後添加下面的代碼 ,創建與服務器的連接:

class ClIEnt {
    static void
Main(string[] args) {

        Console.WriteLine("ClIEnt Running ...");
        TcpClient client = new TcpClIEnt();
        try {
            clIEnt.Connect("localhost", 8500);      // 與服務器連接
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
            return;
        }
        // 打印連接到的服務端信息
        Console.WriteLine("Server Connected!{0} --> {1}",
            client.Client.LocalEndPoint, client.ClIEnt.RemoteEndPoint);

        // 按Q退出
    }
}

上面帶代碼中,我們通過調用Connect()方法來與服務端連接。隨後,我們打印了這個連接消息:本機 的Ip地址和端口號,以及連接到的遠程Ip地址和端口號。TcpClient的ClIEnt屬性返回了一個Socket對象 ,它的LocalEndPoint和RemoteEndPoint屬性分別包含了本地和遠程的地址信息。先運行服務端,再運行 這段代碼。可以看到兩邊的輸出情況如下:

// 服務端:
Server is running ...
Start Listening ...

// 客戶端:
ClIEnt Running ...
Server Connected!127.0.0.1:4761 --> 127.0.0.1:8500

我們看到客戶端使用的端口號為4761,上面已經說過,這個端口號是由.Net隨機選取的,並不需要我 們來設置,並且每次運行時,這個端口號都不同。再次打開“命令提示符”,輸入“netstat -a”,可以 看到下面的輸出:

  TCP    jimmy:8500
0.0.0.0:0              LISTENING
  TCP    jimmy:8500             localhost:4761         ESTABLISHED
  TCP    jimmy:4761             localhost:8500         ESTABLISHED

從這裡我們可以得出幾個重要信息:1、端口8500和端口4761建立了連接,這個4761端口便是客戶端用 來與服務端進行通信的端口;2、8500端口在與客戶端建立起一個連接後,仍然繼續保持在監聽狀態。這 也就是說一個端口可以與多個遠程端口建立通信,這是顯然的,大家眾所周之的HTTP使用的默認端口為80 ,但是一個Web服務器要通過這個端口與多少個浏覽器通信啊。

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