1. 程式人生 > >從零開始學Socket:(三)服務端和客戶端簡單通訊

從零開始學Socket:(三)服務端和客戶端簡單通訊

連線上服務端和客戶端之後,我們就要讓他們互動起來了。(到了現在,大家如果對下面程式碼不懂得地方可以去F12跟蹤至原始碼介面檢視,學習就是這樣

先在服務端編寫傳送函式和接收函式

        /// <summary>
        /// 傳送資料到客戶端
        /// </summary>
        /// <param name="toClientsocket">用以連線客戶端的Socket</param>
        /// <param name="msg">要傳遞的資料</param>
        static void SendMessagesToClient(Socket toClientsocket,string msg)
        {
            //只能傳遞byte陣列
            byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
            toClientsocket.Send(data);
        }
        /// <summary>
        /// 接收來自客戶端的資料
        /// </summary>
        /// <param name="toClientsocket">用以連線客戶端的Socket</param>
        static void ReceiveMessages(Socket toClientsocket)
        {
            byte[] data = new byte[1024];
            int count = toClientsocket.Receive(data);
            string msg = Encoding.UTF8.GetString(data, 0, count);
            Console.WriteLine("{0} {1}", "收到來自客戶端的訊息:", msg);
        }

然後在客戶端編寫接收和傳送資訊的函式

        /// <summary>
        /// 接收來自服務端的訊息
        /// </summary>
        static void ReceiveMessages()
        {
            byte[] data = new byte[1024];
            int count = clientSocket.Receive(data);
            string msg = Encoding.UTF8.GetString(data, 0, count);
            Console.WriteLine("{0} {1}", "收到來自伺服器的訊息:", msg);
        }
        /// <summary>
        /// 傳送資訊到服務端
        /// </summary>
        /// <param name="msg">要傳送的資訊</param>
        static void SendMessagetoServer(string msg)
        {
            //將字串轉為byte陣列
            byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
            //傳送到伺服器
            clientSocket.Send(data);
        }

服務端程式碼

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Server
{
    class Program
    {
        static Socket serverSocket;
        static void Main(string[] args)
        {
            StartServer();
            //暫停
            Console.ReadKey();
        }
        /// <summary>
        /// 開啟一個Socket
        /// </summary>
        static void StartServer()
        {
            //例項化一個Socket
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //設定IP
            IPAddress ipAdress = IPAddress.Parse("127.0.0.1");

            //設定網路終結點
            IPEndPoint iPEndPoint = new IPEndPoint(ipAdress, 88);

            //繫結ip和埠號
            serverSocket.Bind(iPEndPoint);

            //等待佇列(開始監聽埠號)
            serverSocket.Listen(0);

            //非同步接受客戶端連線
            serverSocket.BeginAccept(AcceptCallBack, serverSocket);

        }

        /// <summary>
        /// 傳送資料到客戶端
        /// </summary>
        /// <param name="toClientsocket">用以連線客戶端的Socket</param>
        /// <param name="msg">要傳遞的資料</param>
        static void SendMessagesToClient(Socket toClientsocket,string msg)
        {
            //只能傳遞byte陣列
            byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
            toClientsocket.Send(data);
        }

        /// <summary>
        /// 接收來自客戶端的資料
        /// </summary>
        /// <param name="toClientsocket"></param>
        static void ReceiveMessages(Socket toClientsocket)
        {
            byte[] data = new byte[1024];
            int count = toClientsocket.Receive(data);
            string msg = Encoding.UTF8.GetString(data, 0, count);
            Console.WriteLine("{0} {1}", "收到來自客戶端的訊息:", msg);
        }

        /// <summary>
        /// 當客戶端連線到伺服器時執行的回撥函式
        /// </summary>
        /// <param name="ar"></param>
        static void AcceptCallBack(IAsyncResult ar)
        {
            Console.WriteLine("一個客戶端連線進來了。");
            //這裡獲取到的是向客戶端收發訊息的Socket
            Socket toClientsocket = serverSocket.EndAccept(ar);
            //要向客戶端傳送的訊息    
            string msg = "Hello client!你好。";
            //傳送訊息
            SendMessagesToClient(toClientsocket, msg);
            //接收客戶端傳來的訊息
            ReceiveMessages(toClientsocket);
        }



    }
}

客戶端程式碼

using System;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace ClientTest
{
    class Program
    {
        //宣告客戶端
        static Socket clientSocket;
        static void Main(string[] args)
        {
            StartClient();
            ReceiveMessages();
            SendMessagetoServer("Hello Server!你好。");
            Console.ReadKey();
        }
        /// <summary>
        /// 開啟客戶端並連線到伺服器端
        /// </summary>
        static void StartClient()
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 88));
        }
        /// <summary>
        /// 接收來自服務端的訊息
        /// </summary>
        static void ReceiveMessages()
        {
            byte[] data = new byte[1024];
            int count = clientSocket.Receive(data);
            string msg = Encoding.UTF8.GetString(data, 0, count);
            Console.WriteLine("{0} {1}", "收到來自伺服器的訊息:", msg);
        }
        /// <summary>
        /// 傳送資訊到服務端
        /// </summary>
        /// <param name="msg">要傳送的資訊</param>
        static void SendMessagetoServer(string msg)
        {
            //將字串轉為byte陣列
            byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
            //傳送到伺服器
            clientSocket.Send(data);
        }
    }
}

執行結果