1. 程式人生 > >unity網路----簡單基礎

unity網路----簡單基礎

網路

TCP:與打電話類似,通知服務到位

UDP:與發簡訊類似,訊息發出即可

IP和埠號是網路兩大重要成員

埠號(Port)分為知名埠號[0-1024,不開放)和動態埠號[1024,10000多,開放可用)

三次握手,四次揮手:

unity網端簡單案例:

分為:綜合管理部分、客戶端和伺服器

需要Socket作為媒介來進行互動

見程式碼:

 一、綜合管理部分:

 

 

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using System.Net;
 5 using System.Net.Sockets;
 6 using System.Threading;
 7 using System;
 8 
 9 //綜合管理部分
10 // 可以供客戶端和伺服器一塊使用
11 public class TcpSocket
12 {
13     private Socket socket;//當前例項化的套接字
14     private byte[] data;//socket上的資料  
15     private bool isServer; //用來區分伺服器  還是客戶端
16 
17 //構造TcpSocket
18     public TcpSocket(Socket socket,int dataLength, bool isServer)
19     {
20         this.socket = socket;
21         data = new byte[dataLength];
22         this.isServer = isServer;
23     }  
24 // 接受----->客戶端
25     public void ClientReceive()
26     {
27         //data:資料快取   0:接受位的偏移量  length
28         socket.BeginReceive(data,0,data.Length,SocketFlags.None,new AsyncCallback(ClientEndReceive),null);
29     }
30     public void ClientEndReceive(IAsyncResult ar)
31     {
32         int receiveLength = socket.EndReceive(ar); //資料的處理      
33         string dataStr = System.Text.Encoding.UTF8.GetString(data,0, receiveLength); //把接受完畢的位元組陣列轉化為 string型別
34         if (isServer)
35         {  Debug.Log("伺服器接受到了:" + dataStr);           
36             for (int i = 0; i < Server.Instance.clients.Count; i++) //伺服器要回什麼
37             {
38                 if (Server.Instance.clients[i].ClientConnect())
39                 {
40                     Server.Instance.clients[i].ClientSeed(System.Text.Encoding.UTF8.GetBytes("伺服器回覆:"+ dataStr));
41                 }
42             }
43         }else {
44             DataManager.Instance.Msg = dataStr;            
45             Debug.Log("客戶端接受到了:" + dataStr);
46         }
47     }
48 
49 
50 // 傳送---->客戶端傳送給伺服器
51     public void  ClientSeed(byte[] data)
52     {
53         socket.BeginSend(data,0, data.Length, SocketFlags.None,new AsyncCallback(ClientSeedEnd),null );
54     }
55 
56     private void ClientSeedEnd(IAsyncResult ar)
57     {
58         socket.EndSend(ar);
59     }
60 
61 
62 //連線----客戶端與伺服器連線
63     public void ClientConnect(string ip,int port)
64     {
65         socket.BeginConnect(new IPEndPoint(IPAddress.Parse(ip), port),new AsyncCallback(ClientEndConnect),null);
66     }
67     public void ClientEndConnect(IAsyncResult ar)
68     {
69         if (ar.IsCompleted) {
70             Debug.Log("連線成功");
71         }
72         socket.EndConnect(ar);
73     }
74 
75 // 客戶端與伺服器是否連線
76 
77     public bool IsClientConnect()
78     {
79         return socket.Connected;
80     }
81 //斷開連線
82     public void ClientClose()
83     {
84         if (socket!=null&& ISClientConnect())
85         {
86             socket.Close();
87         }
88     }
89 
90 }
View Code

 

 二、伺服器部分:

      注意:回撥函式AcceptClient只有當伺服器接受連線(連線成功了)才會被呼叫.

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using System.Net;
 5 using System.Net.Sockets;
 6 using System.Threading;
 7 using System;
8 9 // 伺服器 10 11 public class Server : MonoBehaviour { 12 13 //單例伺服器,繼承Mono的 14 private static Server instance; 15 public static Server Instance 16 { 17 get { return instance; } 18 } 19 private void Awake() 20 { 21 instance = this; 22 } 23 //------------------------------------------------------------------------
24 private Socket server;//定義一個伺服器 25 public List<TcpSocket> clients;//所有連線的客戶端 26 private bool isLoopAccept = true;//是否迴圈接受客戶端的請求 27 28 void Start () 29 { 30 //初始化伺服器socket 協議族 31 server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 32 server.Bind(new IPEndPoint(IPAddress.Any,10086));//繫結埠號 33 server.Listen(100); //可以監聽的客戶端數目 34 //------------------------------------------------------------------------ 35 //開闢一個執行緒 處理客戶端連線請求 執行緒要暫停需用listenThread.Abort(); 36 Thread listenThread = new Thread(ReceiveClient); 37 listenThread.Start(); //開啟執行緒 38 listenThread.IsBackground = true; //後臺執行 39 //------------------------------------------------------------------------ 40 //初始化連線的客戶端 41 clients = new List<TcpSocket>(); 42 43 } 44 45 // 持續處理 接受客戶端連線的請求 46 private void ReceiveClient() 47 { 48 while (isLoopAccept) 49 { 50 server.BeginAccept(AcceptClient,null); //開始接受客戶端連線請求 51 Debug.Log("檢測客戶端連線中....."); 52 Thread.Sleep(1000);//每隔1s檢測 有沒有連線我 53 } 54 } 55 // 客戶端連線成功之後回撥 56 private void AcceptClient(IAsyncResult ar) 57 { 58 //連線成功後處理該客戶 59 Socket client = server.EndAccept(ar); 60 TcpSocket clientSocket = new TcpSocket(client,1024,true); 61 clients.Add(clientSocket); 62 Debug.Log("連線成功"); 63 } 64 //關閉專案終止執行緒,停止伺服器. 65 private void OnApplicationQuit() 66 { 67 listenThread.Abort(); 68 listenThread.IsBackground = true;//關閉執行緒 69 } 70 }
View Code

 

 三客戶端部分:

 

using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System;
using UnityEngine;
using UnityEngine.UI;

//客戶端
public class Client : MonoBehaviour {
    public InputField  input;
    public Text receiveText;

    TcpSocket tcpClient;
    Socket client;

    void Start () {
        //註冊監聽事件
        receiveText = GameObject.Find("ReceiveText").GetComponent<Text>();      
        
        tcpClient = new TcpSocket(client,1024,false);//初始化綜合處理器
        client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化客戶端
    }              
    void Update () {
        if (tcpClient != null && tcpClient.IsClientConnect())//如果客戶端不為空且客戶端已連線
        {
            tcpClient.ClientReceive();//執行綜合管理器中的ClientReceive()
        }
        receiveText.text = DataManager.Instance.Msg;
    }
    public void OnClickConnectBtn()//客戶端向伺服器開始連線輸入(IP和埠號)按鈕事件
    {
        if (!tcpClient.IsClientConnect())
        {
            tcpClient.ClientConnect("10.50.6.129",10086);
        }
    }
    public void OnClickToSendServer()//客戶端向伺服器傳送文字訊息按鈕事件
    {
        if (tcpClient != null && tcpClient.IsClientConnect() && !String.IsNullOrEmpty(input.text))
        {
            tcpClient.ClientSeed(System.Text.Encoding.UTF8.GetBytes(input.text));
            input.text = "";
        }
    }
    private void OnApplicationQuit()//關閉專案,退出伺服器連線
    {
        if (tcpClient != null && tcpClient.ClientConnect())
        {
            tcpClient.ClientClose();
        }
    }
    
}
View Code