Unity3D遊戲製作學習記錄01——叢林戰爭

Unity3D遊戲製作學習記錄01——叢林戰爭

Siki學院的視頻教程指路牌:http://www.sikiedu.com/course/61.
學業繁忙…和朋友一起跟着siki的叢林戰爭的教程跟着做來交作業,僅用於學習筆記記錄,最終的成品效果也不知道,翻不翻車我們拭目以待(●ˇ∀ˇ●)

TCP/IP介紹

在網絡通信中,路由器是起到一箇中轉站的作用,發送的目的主機就是靠路由器識別IP轉發,IP就是目的主機的地址。

IP粗略分類:

局域網IP:是可以通過ipconfig查詢到的,是在連接同一個路由的主機構成的一個局域網內,由路由分配的IP。在這個局域網內,IP唯一且不可重複。(本地座標系)
公網IP:不可以在本地查詢,它是該局域網內的主機對於外界的位置標識,是同一局域網內主機共享的IP。可以通過百度查找得到。(世界座標系)

端口號

由於IP可以定位到主機,主機上不同的要通信的程序佔用着不同的端口,因此要到軟件的話,需要IP+端口來定位。

一、服務器端——簡單收發

① 工程創建

VS2019 項目類型:C# .Net Framework 控制檯應用
.net framework
創建服務器項目:TCPServer
服務器新項目

② 代碼編寫

實現步驟

  1. 創建套接字,一般是指定套接字綁定ip的類型(IPv4/IPv6),套接字通信的類型,套接字所使用的協議;
  2. 套接字綁定IP;由於現在的主機一般都是配置了兩個網卡,有的甚至更多,我們要讓這個套接字知道是監聽哪一個ip的通信消息,所以要爲套接字綁定IP。
    關於IP:我們除了ipconfig 查看到對應IP,也可以填寫“127.0.0.1”,這個IP是默認當前主機的IP,如果實在不清楚,就可以直接寫這個。
    IPaddress: 就是IP地址,即127.0.0.1
    IPEndPoint: IP:Port,IP地址加上端口號127.0.0.1:xxxxxx
  3. 把套接字開啓監聽,監聽方法的參數是int類型的,它表示的是處理客戶端請求的數量,即可以處理的等待隊列的長度,但不表示可以容納服務器的最大連接數,參數爲0時表示無限制。
    class Program
    {
        static void Main(string[] args)
        {
            //用於通信的套接字: IP類型,套接字類型:管道通信, 協議:TCP
            Socket serverScoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
            // 定義IP
            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            int port = 7788;
            IPEndPoint iPEndPoint = new IPEndPoint(ipAddress, port);
            
            // 綁定IP
            serverScoket.Bind(iPEndPoint);
            
            // 開啓監聽
            serverScoket.Listen(0);
        }
    }
  1. 監聽開啓後,要接收所收到的連接請求,接收連接的方法Accept()執行過程中會一直等待,直到有連接了纔會執行Accept()下面的代碼。而Accept()會返回一個Socket類型的變量,是關於監聽到的客戶端套接字的連接。
  2. 嘗試向客戶端發送一條消息,並簡單接收一下客戶端發來的消息
    關於接收客戶端的消息,由於我們不肯定接收的消息的長度,因此Receive()方法會有一個int返回值,是返回的消息的字符數。在轉換爲字符串的時候,我們需要指明是從第幾個位置開始讀,讀多長的消息內容。
  3. 因爲僅用於測試,因此我們在上述一些操作之後,我們把和客戶端的連接關閉掉,服務器也關閉掉。
    要注意的是:客戶端是否關閉,服務器並不能控制,這裏僅僅是把連接關閉。
            // 等待連接,直到接收到連接請求
            Socket clientSocket = serverScoket.Accept();

            // 向客戶端發送一條消息(二進制)
            string msgSend = "連接成功,服務器向客戶端發送消息...";
            byte[] msgByt = System.Text.Encoding.UTF8.GetBytes(msgSend);
            clientSocket.Send(msgByt);

            // 定義緩存區,接收客戶端發來的消息
            byte[] readBuf = new byte[1024];
            int count = clientSocket.Receive(readBuf);
            string msgRecv = System.Text.Encoding.UTF8.GetString(readBuf, 0, count);
            Console.WriteLine(msgRecv);

            Console.ReadKey();

            // 關閉連接
            clientSocket.Close();
            serverScoket.Close();

二、客戶端——簡單收發

在原來的解決方案上,右鍵添加新項目:TCPClient
新建服務器項目

具體代碼

客戶端發送消息,由用戶自定義輸入用於檢測,並在連接斷開前,都補充了Console.ReadKey();用於觀察結果。

        static void Main(string[] args)
        {
            //用於通信的套接字: IP類型,套接字類型:管道通信, 協議:TCP
            Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // 服務器請求連接客戶端
            socketClient.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7788));

            // 客戶端接收消息
            // 定義緩存區,存儲接收到的服務器消息
            byte[] readBuf = new byte[1024];
            int count = socketClient.Receive(readBuf);
            string msgRecv = System.Text.Encoding.UTF8.GetString(readBuf, 0, count);
            // 將消息顯示在控制檯上
            Console.WriteLine(msgRecv);

            // 客戶端向服務器發送消息,發送的消息由用戶在控制檯輸入
            string msgSend = Console.ReadLine();
            socketClient.Send(System.Text.Encoding.UTF8.GetBytes(msgSend));

            Console.ReadKey();

            // 關閉連接
            socketClient.Close();
        }

運行結果

  1. 首先運行服務器
    服務器
  2. 運行客戶端,接收到和客戶端發送的消息 在這裏插入圖片描述
  3. 客戶端編輯自定義消息 在這裏插入圖片描述
  4. 服務器端消息接收
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章