這邊簡單來講,有兩個程式分別在兩台電腦上,希望可以透過網路來互相傳遞資料,因此其中之一的作法便是透過UDP方式來進行傳送資料。
可以分開寫成兩個程式,也可以全部都寫在同一個程式內,然後自己再另外寫可選擇當Server或Client的程式。我是常常寫在一個程式內,然後再外加可選擇的方式來定義Server和Client。
所以以下單純來看Script,有Server和Client的Script。
先來看當Client的Script:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using System.Net;
- using System.Net.Sockets;
- public class ClientController : MonoBehaviour {
- private IPEndPoint ipEndPoint;
- private UdpClient udpClient;
- private byte[] sendByte;
- void Start ()
- {
- ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555);
- udpClient = new UdpClient();
- SendUDPData("這是要傳送的資料");
- }
- void Update ()
- {
- }
- void SendUDPData(string tempData)
- {
- sendByte = System.Text.Encoding.UTF8.GetBytes(tempData);
- udpClient.Send(sendByte, sendByte.Length, ipEndPoint);
- }
- }
這邊範例的IPAddress是使用Local端,當然也可以使用網際網路的網址。
仔細看程式碼的話,便會知道Client單方面的向Server發送了資料。
再來看當Server的Script:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading;
- public class ServerController : MonoBehaviour {
- private IPEndPoint ipEndPoint;
- private UdpClient udpClient;
- private Thread receiveThread;
- private byte[] receiveByte;
- private string receiveData = "";
- void Start ()
- {
- ipEndPoint = new IPEndPoint(IPAddress.Any, 5555);
- udpClient = new UdpClient(ipEndPoint.Port);
- receiveThread = new Thread(ReceiveData);
- receiveThread.IsBackground = true;
- receiveThread.Start();
- }
- void Update ()
- {
- }
- void ReceiveData()
- {
- while (true)
- {
- receiveByte = udpClient.Receive(ref ipEndPoint);
- receiveData = System.Text.Encoding.UTF8.GetString(receiveByte);
- Debug.Log("接收到:" + receiveData);
- }
- }
- private void OnDisable()
- {
- udpClient.Close();
- receiveThread.Join();
- receiveThread.Abort();
- }
- private void OnApplicationQuit()
- {
- receiveThread.Abort();
- }
- }
可以看到Server的接收是寫在Thread裡面,如果不另外開執行緒來進行資料的監聽接收,那程式會卡死在那不會動,這點很重要。
關閉程式時,一定要徹底關閉這個Thread;不然即使程式關閉了,這個Thread還會依然持續執行,相關資訊可自行上網查詢。
這裡寫的是Client發送資料給Server的單方向範例,當然也可以Server發送資料給Client,寫法完全一樣。
因為我想要最直接呈現UDP的寫法,所以相關安全措施大都沒有加入,像Try catch等這些安全機制其實是應該要加入的。