018-直接利用Socket/TCP開發網絡遊戲一

因爲在前幾天,我已經花了不少的時間在fishingJoy上面的,在這裏就不寫了,由於在寫一遍也沒有什麼做用。c#

今天咱們正式開始網絡部分的學習,在這個網絡的部分咱們直接是使用c#中的socket來開發的,全部,這樣就會更加直接,相對於用框架而言。如其餘的類同樣,vs也把網絡部分封裝成一個類,這樣就大大減小了咱們開發的難度。在此以前,咱們仍是有必要來了解一下網絡部分的基礎知識。就是IP與端口號。服務器

網絡之間互連的協議也就是爲計算機網絡相互鏈接進行通訊而設計的協議。在因特網中,它是能使鏈接到網上的全部計算機網絡實現相互通訊的一套規則,規定了計算機在因特網上進行通訊時應當遵照的規則。任何廠家生產的計算機系統,只要遵照IP協議就能夠與因特網互連互通。IP地址具備惟一性,根據用戶性質的不一樣,能夠分爲5類。另外,IP還有進入防禦,知識產權,指針寄存器等含義。網絡

網絡技術中,端口(Port)包括邏輯端口和物理端口兩種類型。物理端口指的是物理存在的端口,如ADSL Modem、集線器交換機路由器上用 於鏈接其餘網絡設備的接口,如RJ-45端口、SC端口等等。邏輯端口是指邏輯意義上用於區分服務的端口,如TCP/IP協議中的服務端口,端口號的範圍從0到65535,好比用於瀏覽網頁服務的80端口,用於FTP服務的21端口等。因爲物理端口和邏輯端口數量較多,爲了對端口進行區分,將每一個端口進行了編號,這就是端口號框架

以上就是有關IP與端口號的解釋,咱們對於這個只要知道一下就好了,IP與端口號綁定才能上網。socket

說到網絡鏈接,咱們只要要講到TCP的三次握手,與四次揮手。只有完成三次握手,客戶端與服務器端才能進行通訊。只有完成四次揮手,客戶端與服務器端才能完成斷開鏈接,不然會報錯。函數

咱們首先建立一個解決方案,叫TCP服務器端,要注意的一點就是是客戶端端向服務器端發起請求。學習

 //實例化服務器端
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //得到IP地址
            IPAddress iPAddress = IPAddress.Parse("127.0.0.1");
            //端口號與IP地址
            IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, 88);
            //服務器端綁定IP地址與端口號
            serverSocket.Bind(iPEndPoint);
            serverSocket.Listen(0);

首先建立一個服務器的socket類,將其中的類型,寫好,在其中設定IP地址與端口號,並進行綁定。spa

serverSocket.BeginAccept(AcceptCallBack, serverSocket);

接着就是開始接受,注意的是這裏須要有一個回調函數,接着計算機網絡

 static void AcceptCallBack(IAsyncResult ar)
        {
            Socket serverSocket = ar.AsyncState as Socket;
            Socket clientSocket = serverSocket.EndAccept(ar);
            string msg = "Hello Client 您好...";
            byte[] data = Encoding.UTF8.GetBytes(msg);
            clientSocket.Send(data);

            clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);
            serverSocket.BeginAccept(AcceptCallBack, serverSocket);
        }

開始寫回調函數,將用於返回的socket定義成服務器socket,將結束接受並傳來的socket定義成客服端socket,服務器端向客戶端發送一個信息,表示已經正常鏈接了,接受客戶端向服務器端傳送信息,就是begin receive方法。可是這個方法也是須要回調函數的,因此咱們還要寫設計

 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();
                }
            }
        }

若是你在方法中穿的是什麼,那個這個AsyncState的類型就是什麼,獲得客戶端發送結束的信息,並把它說出,由於客戶端有可能屢次的發送數據,因此咱們須要在其中在寫調用本身的方法,這樣,就能夠再次輸出數據的了,前面的再次調用接受也是同樣的,這樣寫的是爲了能夠接受多個客戶端。接下來:

static void Main(string[] args)
        {
            ServerAsync();
            Console.ReadKey();
        }

以上是服務器端的部分,接下來就是客戶端的部分了。

前面的基本操做也是同樣的:

static void Main(string[] args)
        {
            //建立客戶端的的socket類
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //與客戶端的進行綁定
            clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 88));
            byte[] data = new byte[1024];
            int count = clientSocket.Receive(data);
            string msg = Encoding.UTF8.GetString(data, 0, count);
            Console.Write(msg);
            while (true)
            {
                string s = Console.ReadLine();
                if (s == "c")
                {
                    clientSocket.Close();
                    return;
                }
                //向客戶端發送信息
                clientSocket.Send(Encoding.UTF8.GetBytes(s));
            }
            Console.ReadKey();
            clientSocket.Close();
        }

其實就是這麼多。咱們要注意的是 127.0.0.1是主機就是localhost。今天的部分就是這麼多。

相關文章
相關標籤/搜索