C# TcpClient TcpListener 簡單練習01

來源:互聯網
上載者:User

下面是讀《Visual C#.Net 網路編程》整理的練習代碼。

用戶端發送命令給服務端,從伺服器端擷取所有人員的成績或者指定人員的成績。

命令格式為 GET 0|1 [Name]。0為擷取所有人員的成績,1為擷取指定姓名的人員成績

用戶端參數為:IP地址 連接埠 0|1 [Name]。例如client 127.0.0.1 60000 1 李四

伺服器端的大體流程為:定義TcpListener對象、開啟連接埠、進入迴圈開始監聽用戶端的串連、如果有串連讀取資料並進行反饋。

用戶端的大體流程為:定義TcpClient對象、串連伺服器端、發送命令、進入迴圈讀取伺服器端返回的結果。

代碼下載:

伺服器端代碼:

using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;using System.IO;namespace Server{    class Program    {        public static string[] arrName = {"李四","王五","趙六"};         public static int[] arrGrade = { 80, 90, 100 };        static void Main(string[] args)        {            Console.WriteLine("正在初始化Socket服務...");            TcpListener listner;            try            {                //監聽連接埠號碼為60000                listner = new TcpListener(60000);            }            catch            {                Console.WriteLine("建立監聽連接埠失敗!");                return;            }            listner.Start(); //開始監聽            Console.WriteLine("Scoket服務初始化完畢,正在等待串連...");            bool loop = true;            //進入監聽迴圈,由於沒有應用多線程,所以不支援多使用者並發訪問            while (loop)            {                Socket socket = listner.AcceptSocket();  //監聽用戶端的串連,線程阻塞,直到有用戶端串連為止                NetworkStream ns = new NetworkStream(socket);    //建立網路流對象                StreamReader reader = new StreamReader(ns);                string cmd = reader.ReadLine();  //讀取用戶端發送過來的命令                char split = ' ';    //定義命令分隔字元,協議類似 GET 0|1 [name],0代表擷取所有人員的成績,1代表擷取name的成績                string[] arrCmd; //定義一個數組,用於存放解析出來的命令參數                //解析命令字串                arrCmd = cmd.Split(split);                int paramCount = arrCmd.GetLength(0);                arrCmd[0] = arrCmd[0].ToUpper();                if (arrCmd[0] == "GET")                {                    if (arrCmd[1] == "0")                    {                        for (int i = 0; i < arrName.Length; i++)                        {                            string str = String.Format("{0} {1}\r\n", arrName[i], arrGrade[i]);                            //byte[] res = Encoding.ASCII.GetBytes(str.ToCharArray());                            byte[] res = Encoding.UTF8.GetBytes(str.ToCharArray());                            socket.Send(res);   //發送回應給用戶端                        }                    }                    else if (arrCmd[1] == "1")                    {                        if (arrCmd.GetLength(0) != 3)                        {                            string str = "命令列錯誤,沒有包含要查詢的姓名" + Environment.NewLine;                            byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());                            socket.Send(res);                        }                        else                        {                            bool founded = false;                            arrCmd[2] = arrCmd[2].Trim();                            for (int i = 0; i < arrName.Length; i++)                            {                                if (arrName[i] == arrCmd[2])                                {                                    string str = String.Format("{0} {1}\r\n", arrName[i], arrGrade[i]);                                    byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());                                    socket.Send(res);                                    founded = true;                                    break;                                }                            }                            if (founded == false)                            {                                string str = String.Format("沒有找到姓名為【{0}】的成績!{1}", arrCmd[2], Environment.NewLine);                                byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());                                socket.Send(res);                            }                        }                    }                }                else                {                    string str = String.Format("命令錯誤,當前命令頭是{0},命令頭應該為GET{1}", arrCmd[0], Environment.NewLine);                    byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());                    socket.Send(res);                }                //發送一個空行,用戶端以此來確定,資料接收完畢,用戶端退出                string endFlag = Environment.NewLine;                byte[] endRes = System.Text.Encoding.UTF8.GetBytes(endFlag.ToCharArray());                socket.Send(endRes);            }        }    }}

用戶端代碼

using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;namespace Client{    class Program    {        static void Main(string[] args)        {            TcpClient client = null;                        //判斷參數是否準確,參數應為:伺服器IP 連接埠(60000)選項(0或1) [姓名](如果選項為1)            if (args.Length != 3 && args.Length != 4)            {                Console.WriteLine(args.Length);                Console.WriteLine("參數錯誤!");                return;            }            string strHost = args[0].Trim();    //伺服器位址            ushort uiPort = Convert.ToUInt16(args[1]);  //伺服器連接埠            string strCmd; //定義命令列            if (args.Length == 3)            {                //取所有人員的成績                strCmd = String.Format("GET {0}{1}", args[2], Environment.NewLine);            }            else            {                strCmd = String.Format("GET {0} {1}{2}", args[2], args[3], Environment.NewLine);            }            Console.WriteLine("開始初始化用戶端...");            Console.WriteLine(String.Format("開始串連到 {0}:{1}...", strHost, uiPort));            try            {                client = new TcpClient(strHost, uiPort);            }            catch            {                Console.WriteLine("不能串連到伺服器端!");                return;            }            //初始化網路輸入輸出資料流            NetworkStream ns = client.GetStream();            System.IO.StreamReader sr = new System.IO.StreamReader(ns);            Console.WriteLine(String.Format("已經串連到 {0}:{1}...", strHost, uiPort));            string result;            Console.WriteLine(strCmd);            byte[] cmd = System.Text.Encoding.UTF8.GetBytes(strCmd.ToCharArray());            //發送請求通訊指令            ns.Write(cmd, 0, cmd.Length);            //擷取伺服器端的反饋            Console.WriteLine("結果為:");            while (true)            {                //接收結果                result = sr.ReadLine();                if (result == "")                {                    break;                }                Console.WriteLine(result);            }            Console.WriteLine("正在關閉串連...");            //中斷連線            client.Close();            Console.WriteLine("按任意鍵退出");            Console.ReadLine();        }    }}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.