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

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

編輯:關於C語言

3.服務端獲取客戶端連接

3.1 獲取單一客戶端連接

上面服務端、客戶端的代碼已經建立起了連接,這通過使用“netstat -a”命令,從端口的狀態可以 看出來,但這是操作系統告訴我們的。那麼我們現在需要知道的就是:服務端的程序如何知道已經與一個 客戶端建立起了連接?

服務器端開始偵聽以後,可以在TcpListener實例上調用AcceptTcpClient()來獲取與一個客戶端的連 接,它返回一個TcpClient類型實例。此時它所包裝的是由服務端去往客戶端的Socket,而我們在客戶端 創建的TcpClIEnt則是由客戶端去往服務端的。這個方法是一個同步方法(或者叫阻斷方法,block method),意思就是說,當程序調用它以後,它會一直等待某個客戶端連接,然後才會返回,否則就會一 直等下去。這樣的話,在調用它以後,除非得到一個客戶端連接,不然不會執行接下來的代碼。一個很好 的類比就是Console.ReadLine()方法,它讀取輸入在控制台中的一行字符串,如果有輸入,就繼續執行下 面代碼;如果沒有輸入,就會一直等待下去。

class Server {
    static void
Main(string[] args) {
        Console.WriteLine("Server is running ... ");
        IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
        TcpListener listener = new TcpListener(ip, 8500);

        listener.Start();           // 開始偵聽
        Console.WriteLine("Start Listening ...");

        // 獲取一個連接,中斷方法
        TcpClient remoteClient = listener.AcceptTcpClIEnt();

        // 打印連接到的客戶端信息
        Console.WriteLine("ClIEnt Connected!{0} <-- {1}",
           remoteClient.Client.LocalEndPoint, remoteClient.ClIEnt.RemoteEndPoint);

        // 按Q退出
    }
}

運行這段代碼,會發現服務端運行到listener.AcceptTcpClIEnt()時便停止了,並不會執行下面的 Console.WriteLine()方法。為了讓它繼續執行下去,必須有一個客戶端連接到它,所以我們現在運行客 戶端,與它進行連接。簡單起見,我們只在客戶端開啟一個端口與之連接:

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退出
    }
}

此時,服務端、客戶端的輸出分別為:

// 服務端
Server is running ...
Start Listening ...
ClIEnt Connected!127.0.0.1:8500 <-- 127.0.0.1:5188

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

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