1. 程式人生 > >.Net之美讀書筆記10(網絡編程一)

.Net之美讀書筆記10(網絡編程一)

字符 命令 port ace 應用 獲得 簡單 進程 ssa

網絡編程(Socket)

這裏對網絡編程做下簡單的整理,填補下自己這方面的知識空白。如果想了解請參考張子陽的.Net之美.
***
概念講述

  • TCP:面向連接的傳輸協議(網絡協議的一種)
  • 遠程主機: 跨進程訪問即為遠程訪問
  • 套接字: 傳輸層與應用層的紐帶,可使應用層編程不用關心傳輸層

    服務器與客戶端鏈接

    服務端開啟監聽服務,客戶端鏈接服務端。新建兩個控制臺程序Server/Client。
    Server:

    static void Main(string[] args)
        {
            Console.WriteLine("Server is running ...");
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            int port = 8500;
    
            TcpListener listener = new TcpListener(ip, port);
            listener.Start();
    
            Console.WriteLine("\n\n Enter \"Q\" exit.");
            ConsoleKey key;
            do
            {
                key = Console.ReadKey(true).Key;
            } while (key != ConsoleKey.Q);
        }

    Client:

    static void Main(string[] args)
        {
            Console.WriteLine("Client Running");
    
            TcpClient client = new TcpClient();
    
            IPAddress serverIp = IPAddress.Parse("127.0.0.1");
            int serverPort = 8500;
    
            try
            {
                client.Connect(serverIp, serverPort);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
    
            Console.WriteLine("Server Connected!{0} --> {1}", client.Client.LocalEndPoint, client.Client.RemoteEndPoint);
    
            Console.WriteLine("\n\n Enter \"Q\" exit.");
            ConsoleKey key;
            do
            {
                key = Console.ReadKey(true).Key;
            } while (key != ConsoleKey.Q);
        }

    命令行運行netstat -a查看端口連接狀態

    服務端獲取客戶端鏈接

    AcceptTcpClient()為阻塞方法,調用後線程等待客戶端鏈接
    Server:

        static void Main(string[] args)
        {
            Console.WriteLine("Server is running ...");
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            int port = 8500;
    
            TcpListener listener = new TcpListener(ip, port);
            listener.Start();
            Console.WriteLine("Start Listening ...");
    
            //目的獲取多個客戶端信息
            while(true)
            {
                try
                {
                    //獲取一個連接,中斷方法(等待客戶端的鏈接)
                    TcpClient remoteClient = listener.AcceptTcpClient();
                    //打印鏈接到的客戶端信息
                    Console.WriteLine("Client Connected!{0}<-{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error:" + ex.Message);
                }
            }
        }

    客戶端發送信息服務端接受

    Server:

    static void Main(string[] args)
        {
            int BufferSize = 8192;
    
            Console.WriteLine("Server is running ...");
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            int port = 8500;
    
            TcpListener listener = new TcpListener(ip, port);
            listener.Start();
            Console.WriteLine("Start Listening ...");
    
            //目的獲取多個客戶端信息
            while(true)
            {
                try
                {
                    //獲取一個連接,中斷方法(等待客戶端的鏈接)
                    TcpClient remoteClient = listener.AcceptTcpClient();
                    //打印鏈接到的客戶端信息
                    Console.WriteLine("Client Connected!{0}<-{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
    
                    //獲得流並寫入buffer中
                    NetworkStream streamToClient = remoteClient.GetStream();
                    byte[] buffer = new byte[BufferSize];
                    int bytesRead = streamToClient.Read(buffer, 0, buffer.Length);
                    Console.WriteLine("Reading data,{0}bytes",bytesRead);
    
                    //獲得請求的字符串
                    string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
                    Console.WriteLine("Received:{0}",msg);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error:" + ex.Message);
                }
            }
        }

    Client:

    static void Main(string[] args)
        {
            Console.WriteLine("Client Running");
    
            TcpClient client = new TcpClient();
    
            IPAddress serverIp = IPAddress.Parse("127.0.0.1");
            int serverPort = 8500;
    
            try
            {
                client.Connect(serverIp, serverPort);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
    
            Console.WriteLine("Server Connected!{0} --> {1}", client.Client.LocalEndPoint, client.Client.RemoteEndPoint);
    
            string msg = "\"Welcome To TraceFact.Net\"";
            NetworkStream streamToServer = client.GetStream();
    
            byte[] buffer = Encoding.Unicode.GetBytes(msg);
            streamToServer.Write(buffer, 0, buffer.Length);
            Console.WriteLine("Sent:{0}",msg);
            Console.WriteLine("\n\n Enter \"Q\" exit.");
            ConsoleKey key;
            do
            {
                key = Console.ReadKey(true).Key;
            } while (key != ConsoleKey.Q);
        }

.Net之美讀書筆記10(網絡編程一)