1. 程式人生 > >Unity網路互動丨一個簡單的網路程式

Unity網路互動丨一個簡單的網路程式

寫在前面

本章目的:實現一個簡單的網路程式,瞭解基本的內容

方法:建立一個伺服器端VS工程,一個客戶端VS工程(此時開著兩個VS!),先執行伺服器端工程,再執行客戶端工程(“開始執行,不除錯)”,看到客戶端先向伺服器傳送字串,伺服器端收到後,將這個字串返回到客戶端,客戶端將它打印出來

預設已配置好PHP執行的相關Web環境:

1、Apache

2、MySQL

3、PHP

 

預覽

以下是上述兩個工程程式碼:

 

伺服器端

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

namespace SimpleServer
{
    class Program
    {
        static void Main()
        {
            //伺服器IP地址,該地址為localhost
            string ip = "127.0.0.1";
            //伺服器埠
            int port = 8000;

            //try catch:https://www.cnblogs.com/shuaijie/articles/3478750.html
            //1、將預見可能引發異常的程式碼包含在try語句塊中。 
            //2、如果發生了異常,則轉入catch的執行。
            //3、e引數來獲得有關異常的資訊
            try
            {
                //獲得終端(就是接收裝置)  using System.Net    IPEndPoint類包含應用程式連線到主機上的服務所需的主機和埠資訊,
                //通過組合服務的主機IP地址和埠號,IPEndPoint類形成到服務的連線點。
                //Parse()方法,把點分的十進位制IP表示轉化成IPAddress類
                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ip), port);

                //0、建立Socket  using System.Net.Sockets
                //1、在客戶 / 伺服器通訊模式中,客戶端需要主動建立與伺服器的Socket(套接字),服務端收到了客戶端的請求,
                //  也會建立與客戶端連線的Socket。Scoket可以看作兩端通訊的收發器,服務端和客戶端都通過Scoket收發資料
                //2、對於 IPv4,返回 System.Net.Sockets.AddressFamily.InterNetwork;
                //  對於 IPv6,返回 System.Net.Sockets.AddressFamily.InterNetworkV6
                //3、SocketType.Stream:(F12可查)支援可靠、 雙向、 基於連線的位元組流,而無需複製資料,不保留邊界。 
                //  一個 Socket 這種型別的通訊與單個對等方並在可以開始通訊之前需要遠端主機的連線。
                //4、ProtocolType.Tcp:(F12可查)傳輸控制協議。
                Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                //將Socket繫結在終端地址上,Bind:將相關聯Socket與本地終結點。
                listener.Bind(ipe);

                //開始監聽,最大允許處理1000個連線
                listener.Listen(1000);
                Console.WriteLine("開始監聽");

                //開始接受客戶端請求 程式在這裡會堵塞
                //Accept:建立一個新Socket為新建立的連線。
                Socket mySocket = listener.Accept();

                byte[] bs = new byte[1024];
                //Receive:接收來自繫結的 Socket 的資料,bs是接收到的資料的儲存位置
                int n = mySocket.Receive(bs);
                //也可寫成:mySocket.Receive(bs);

                //客戶端發來的資料返回給客戶端
                //Send:將資料傳送到連線Socket。
                mySocket.Send(bs);
                //關閉與客戶端的連線
                mySocket.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

 

客戶端

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

namespace SimpleClient
{
    class Program
    {
        static void Main()
        {
            //伺服器IP地址
            string ip = "127.0.0.1";
            //伺服器埠
            int port = 8000;

            try
            {
                //獲得終端
                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ip), port);
                //建立Socket
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                //開始接受客戶端請求 程式在這裡會堵塞
                //Connect: 建立與遠端主機的連線。
                client.Connect(ipe);
                Console.WriteLine("連線到伺服器");

                //向伺服器傳送資料
                string data = "hello,world";
                byte[] bs = UTF8Encoding.UTF8.GetBytes(data);
                client.Send(bs);
                //用一個數組儲存伺服器返回的資料
                byte[] rev = new byte[256];
                //接收到伺服器返回的資料
                client.Receive(rev);

                //UTF8Encoding.UTF8.GetString:將位元組陣列中的一系列位元組解碼為字串。
                Console.WriteLine(UTF8Encoding.UTF8.GetString(rev));
                //關閉連線
                client.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}