簡單的異步通訊(一)

1、服務端代碼以下:數組

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

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            StartOnSncyServer();
            Console.ReadKey();
        }


        static void StartOnSncyServer()
        {
            //建立一個服務端套接字Socket
            Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //把服務端自己的IP設置爲通訊IP
            IPAddress ipAddress = IPAddress.Parse("192.168.1.101");
            //設置端口號
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress,88);
            //設置Bind端口號
            serverSocket.Bind(ipEndPoint);
            //設置服務端監聽
            serverSocket.Listen(0);
            //異步接受客戶端上線
            serverSocket.BeginAccept(AcceptCallBack, serverSocket);
        }

        static byte[] dataBuffer = new byte[1024];
        static void AcceptCallBack(IAsyncResult ar)
        {
            //根據參數獲取服務端套接字Socket
            Socket serverSocket = ar.AsyncState as Socket;
            //接收的客戶端套接字Socket
            Socket clientSocket = serverSocket.EndAccept(ar);

            string sendMessage = "歡迎連接,客戶端....";
            byte[] sendMsg = Encoding.UTF8.GetBytes(sendMessage);
            //向客戶端發送信息
            clientSocket.Send(sendMsg);
            //服務端異步接收信息
            clientSocket.BeginReceive(dataBuffer,0,1024,SocketFlags.None, ReceiveCallBack,clientSocket);
            //異步接受客戶端上線
            serverSocket.BeginAccept(AcceptCallBack, serverSocket);
        }

        static void ReceiveCallBack(IAsyncResult ar)
        {
            Socket clientSocket = null;
            try
            {
                clientSocket = ar.AsyncState as Socket;
                int count = clientSocket.EndReceive(ar);
                if (count == 0)
                {
                    clientSocket.Close();
                    return;
                }
                string msg = Encoding.UTF8.GetString(dataBuffer, 0, count);
                Console.WriteLine("從客戶端接收到數據:" + msg);
                clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);
            }
            catch (Exception e)
            {

                Console.WriteLine(e);
                if (clientSocket != null)
                {
                    clientSocket.Close();
                }
            }
           
        }
    }


    
}

2、客戶端代碼以下:異步

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

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            //建立一個Socket套接字
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //根據IP和端口號連接服務端
            clientSocket.Connect(IPAddress.Parse("192.168.1.101"), 88);
            //接受數據的字節數組
            byte[] byteReceive = new byte[1024];
            //客戶端接收數據,返回一個接受數據的長度count
            int count = clientSocket.Receive(byteReceive);
            //根據UTF8把byte數組轉換成字符串
            string ReceiveMsg = Encoding.UTF8.GetString(byteReceive, 0, count);
            Console.WriteLine(ReceiveMsg);
            while (true)
            {

                string str = Console.ReadLine();
                //當我點擊c字符的時候,客戶端關閉,並return
                if (str == "c")
                {
                    clientSocket.Close();
                    return;
                }
                //向服務端發送信息
                clientSocket.Send(Encoding.UTF8.GetBytes(str));
            }
            
            Console.ReadKey();
        }


    }
}
相關文章
相關標籤/搜索