1. 程式人生 > >C#實現服務端和客戶端互動

C#實現服務端和客戶端互動

需要建兩個工程 、一個客戶端、一個服務端、

服務端程式碼:

using System;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Collections;

//服務端測試程式碼
namespace SimpleServer
{
    class Program
    {
        static void Main(string[] args)
        {
            IpType();
        }
        private static void IpType()
        {
            //IP地址
            IPAddress ipaddr = IPAddress.Parse("127.0.0.1");
            IPEndPoint endPoint = new IPEndPoint(ipaddr, 33678);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //繫結連線,一定要在監聽之前
            socket.Bind(endPoint);
            //開始監聽,最大支援同時5個連線
            socket.Listen(5);
            while(true)
            {
                //如果未檢測到連線,將阻塞,不再繼續執行
                Socket clientSocket = socket.Accept();
                byte[] data = new byte[512];
                //第一次握手,接收到資料確認連結成功
                clientSocket.Receive(data, 0, data.Length, SocketFlags.Partial);
                string s = System.Text.Encoding.Default.GetString(data);
                Console.WriteLine(s.Split('\0')[0]);
                //啟動新執行緒處理客戶端的連線資訊
                Task.Factory.StartNew(() =>
                {
                    reciiveFromClient(clientSocket);
                });
            }
        }

        private static void reciiveFromClient(Socket client)
        {
            byte[] data;
            try
            {
                while (true)
                {
                    //第二次握手,告訴客戶端,服務端已準備好
                    client.Send(System.Text.Encoding.Default.GetBytes("GoOn"));
                    data = new byte[512];
                    //第三次握手,接受資料
                    client.Receive(data, SocketFlags.None);
                    string str = System.Text.Encoding.Default.GetString(data);
                    if (str.StartsWith("_quit"))
                    {
                        //如果檢測到_quit,關閉連線
                        client.Close();
                        Console.WriteLine("連線關閉");
                        break;
                    }
                    else
                    {
                        //控制檯列印資料
                        string info = str.Split('\0')[0];
                        Console.WriteLine("From Client :" + info);
                    }
                }
            } catch(SocketException e){
                //處理異常
            }
        }
    }
}

客戶端程式碼:

using System;
using System.Net;
using System.Net.Sockets;
//客戶端測試程式碼
namespace SimpleClient
{
    class Program
    {
        static void Main(string[] args)
        {
            while(true)
            {
                Client();
                //關閉連線後可提示繼續連線
                Console.WriteLine("End Client");
                Console.WriteLine("是否繼續?是[Y]/否[N]");
                string ss = Console.ReadLine();
                if(!(ss == "Y" || ss == "y"))
                {
                    break;
                }
            }
        }
        private static void Client()
        {
            String guid = Guid.NewGuid().ToString();//唯一標識
            //指定要連線的伺服器IP,本機是127.0.0.1
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            //埠號
            EndPoint ep = new IPEndPoint(ip, 33678);
            Socket client = new Socket(SocketType.Stream, ProtocolType.Tcp);
            //連線到指定主機
            client.Connect(ep);
            string s = "Hello, Server,我是:"+ guid;
            byte[] data = System.Text.Encoding.Default.GetBytes(s);
            //第一次握手,告訴伺服器我已經連線
            client.Send(data, SocketFlags.Partial);
            while (true)
            {
                byte[] dataReturn = new byte[512];
                //第二次握手,確認服務端已準備好
                client.Receive(dataReturn, 0, data.Length, SocketFlags.Partial);
                Console.WriteLine("From Server:" + System.Text.Encoding.Default.GetString(dataReturn));
                //第三次握手,從鍵盤讀取資料
                string info = Console.ReadLine();
                //轉換資料型別
                data = System.Text.Encoding.Default.GetBytes(info);
                //傳輸資料到伺服器
                client.Send(data);
                if (info.StartsWith("_quit"))
                {
                    break;
                }
            }
            //關閉連線
            client.Close();
        }
    }
}