這邊簡單來講,有兩個程式分別在兩台電腦上,希望可以透過網路來互相傳遞資料,因此其中之一的作法便是透過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等這些安全機制其實是應該要加入的。