110 lines
2.9 KiB
C#
110 lines
2.9 KiB
C#
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Threading;
|
|
using UnityEngine;
|
|
|
|
namespace Rokoko.Core
|
|
{
|
|
public class UDPReceiver
|
|
{
|
|
public int sendPortNumber = 14043;
|
|
public int receivePortNumber = 14043;
|
|
public int bufferSize = 65000;
|
|
|
|
private UdpClient client;
|
|
private Thread thread;
|
|
|
|
public virtual void Initialize()
|
|
{
|
|
try
|
|
{
|
|
client = new UdpClient(receivePortNumber);
|
|
client.Client.SendBufferSize = bufferSize;
|
|
}
|
|
catch (SocketException)
|
|
{
|
|
Debug.LogError($"Seem like port:{receivePortNumber} is already in use. Is plugin running already in other application?");
|
|
}
|
|
catch(System.Exception ex)
|
|
{
|
|
throw ex;
|
|
}
|
|
}
|
|
|
|
public virtual void StartListening()
|
|
{
|
|
if (client == null)
|
|
{
|
|
Debug.LogError("UDPReceiver - Client isn't initialized.");
|
|
return;
|
|
}
|
|
|
|
if (thread != null)
|
|
{
|
|
Debug.LogWarning("UDPReceiver - Cannot start listening. Thread is already listening");
|
|
return;
|
|
}
|
|
|
|
StartListeningThread();
|
|
}
|
|
|
|
public virtual void StopListening()
|
|
{
|
|
thread?.Abort();
|
|
client?.Close();
|
|
}
|
|
|
|
public virtual void Dispose()
|
|
{
|
|
StopListening();
|
|
client?.Dispose();
|
|
client = null;
|
|
}
|
|
|
|
public void Send(string ipAddress, byte[] data)
|
|
{
|
|
Send(ipAddress, data, sendPortNumber);
|
|
}
|
|
|
|
public void Send(string ipAddress, byte[] data, int portNumber)
|
|
{
|
|
client?.Send(data, data.Length, new IPEndPoint(IPAddress.Parse(ipAddress), portNumber));
|
|
}
|
|
|
|
public void Send(IPEndPoint endPoint, byte[] data)
|
|
{
|
|
client?.Send(data, data.Length, endPoint);
|
|
}
|
|
|
|
public bool IsListening() => thread != null;
|
|
|
|
protected virtual void OnDataReceived(byte[] data, IPEndPoint endPoint) { }
|
|
|
|
private void StartListeningThread()
|
|
{
|
|
thread = new Thread(ListenToUDP);
|
|
thread.IsBackground = true;
|
|
thread.Start();
|
|
}
|
|
|
|
private void ListenToUDP()
|
|
{
|
|
while (client != null)
|
|
{
|
|
try
|
|
{
|
|
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, receivePortNumber);
|
|
byte[] data = client.Receive(ref endpoint);
|
|
OnDataReceived(data, endpoint);
|
|
}
|
|
catch (ThreadAbortException) { }
|
|
catch (SocketException) { }
|
|
catch (System.Exception ex)
|
|
{
|
|
Debug.Log(ex.Message);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|