c#Socket通信


網絡通信的基本知識:

首先應該確定IP地址和端口號,端口號為了確定計算機的哪個進程,比如同一主機是微信還是qq通信

要進行通信首先應該確定一種協議,通常用TCP可靠和UDP不可靠協議,當然帶來的速度也會不同,多數游戲中采用TCP協議。

 

面向連接套接字通信步驟:

服務端:

先申請一個Socket,綁定一個IP地址和端口,開始接聽,等待接受連接。

客戶端:

申請一個Socket,連接服務器且指定IP和端口號

值得注意的是,服務端有兩個Socket,一個用於監聽,另一個和客戶端進行通信。

 

服務器端代碼:

using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace Socket套接字
{
    class SocketT
    {
        private Socket _ServerSocket;                       //服務器監聽套接字
        private bool _IsListionContect;                     //是否在監聽

        public SocketT()
        {
            //定義網絡終節點(封裝IP和端口)
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),1000);
            //實例化套接字
            _ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //服務端綁定地址
            _ServerSocket.Bind(endPoint);

            //開始監聽
            _ServerSocket.Listen(10);                       //監聽的最大長度
            Console.WriteLine("服務器已經啟動...");

            try
            {
                while (_IsListionContect)
                {
                    //Accept()方法接受客戶端的連接,這個方法會阻斷當前線程的運行
                    Socket sockMsgSever = _ServerSocket.Accept();
                    Console.WriteLine("有一個客戶端連接...");

                    //開啟后台線程,進行客戶端會話
                    Thread thClientMsg = new Thread(ClientMsg);
                    thClientMsg.IsBackground=true;          //設置為后台線程
                    thClientMsg.Name = "thClientMsg";
                    thClientMsg.Start(sockMsgSever);

                }

            }
            catch (Exception)
            {
                
                throw;
            }
        }

        /// <summary>
        /// 服務器端和客戶端通信的后天線程
        /// </summary>
        /// <param name="?"></param>
        private void ClientMsg(object sokMsg)
        {
            Socket socketMsg = sokMsg as Socket; //將object類型轉換為Socket通信

            while (true)
            {
                //准備一個數據緩存
                byte[] msyArray = new byte[0124 * 0124];
                //接受客戶端發來的請求,返回真實的數據長度
                int TrueClientMsgLenth = socketMsg.Receive(msyArray);
                //byte數組轉字符串
                string strMsg = Encoding.UTF8.GetString(msyArray, 0, TrueClientMsgLenth);
                //顯示客戶端數據
                Console.WriteLine("客戶端數據:"+strMsg);
            }
        }


        static void Main(string[] args)
        {
            SocketT obj = new SocketT();
        }
    }
}

 客戶端:

using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace Socket套接字_客戶端
{
    class Client
    {
        private Socket _ClientSocket;                       //客戶端通訊套接字
        private IPEndPoint SeverEndPoint;                   //連接到服務器端IP和端口

        public Client()
        {
            //服務器通信地址
            SeverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000);
            //建立客戶端Socket
            _ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                _ClientSocket.Connect(SeverEndPoint);
            }
            catch (Exception)
            {
            }
            Console.WriteLine("連接服務器端成功!");
        }

        //連接服務器
        public void SendMsg()
        {
            while (true)
            {
                //輸入信息
                string strMsg = Console.ReadLine();
                //退出
                if (strMsg == "exit")
                {
                    break;
                }

                //字節轉換
                Byte[] byeArray = Encoding.UTF8.GetBytes(strMsg);
                //發送數據
                _ClientSocket.Send(byeArray);
                Console.WriteLine("我:" + strMsg);
            }
            //關閉連接
            _ClientSocket.Shutdown(SocketShutdown.Both);
            //清理連接資源
            _ClientSocket.Close();
        }

        static void Main(string[] args)
        {
            Client obj = new Client();
            obj.SendMsg();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM