Простой сервер сокетов в Unity

Я хочу использовать плагин C # в моем проекте Unity. Этот плагин должен действовать как сервер, который будет получать значения от клиента, чтобы я мог использовать эти значения для дальнейшей обработки. Проблема в том, что сервер имеет бесконечный цикл. И бесконечные петли заставляют Unity висеть. Как справиться с этим?

EDIT: Я прикрепляю fragment кода серверной программы. На мой взгляд, есть 2 момента, которые могут вызвать проблемы. Бесконечные циклы и точка, в которой программа приостанавливается, как прокомментировано в коде:

void networkCode() { // Data buffer for incoming data. byte[] bytes = new Byte[1024]; // Establish the local endpoint for the socket. // Dns.GetHostName returns the name of the // host running the application. IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 1755); // Create a TCP/IP socket. listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Bind the socket to the local endpoint and // listen for incoming connections. try { listener.Bind(localEndPoint); listener.Listen(10); // Start listening for connections. while (true) { // Program is suspended while waiting for an incoming connection. Debug.Log("HELLO"); //It works handler = listener.Accept(); Debug.Log("HELLO"); //It doesn't work data = null; // An incoming connection needs to be processed. while (true) { bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); data += Encoding.ASCII.GetString(bytes, 0, bytesRec); if (data.IndexOf("") > -1) { break; } System.Threading.Thread.Sleep(1); } System.Threading.Thread.Sleep(1); } } catch (Exception e) { Debug.Log(e.ToString()); } } 

EDIT: после помощи @Programmer плагин C # завершен. Но Unity не читает правильные значения. Я прикрепляю код стороны Unity:

 using UnityEngine; using System; using SyncServerDLL; //That's our library public class receiver : MonoBehaviour { SynchronousSocketListener obj; //That's object to call server methods // Use this for initialization void Start() { obj = new SynchronousSocketListener (); obj.startServer (); } // Update is called once per frame void Update() { Debug.Log (obj.data); } } 

Я тестировал class SynchronousSocketListener полностью в Visual Studio. Это дает хорошие результаты.

Используйте Thread для вашего сервера. Слушайте, читайте и записывайте действия. Вы можете объявить сокет и другие сетевые объекты как public, а затем инициализировать их в функции streamа.

Unity не работает с циклами в streamах и иногда может замерзать , но вы можете исправить это, добавив System.Threading.Thread.Sleep(1); в вашем цикле while, где вы читаете или ожидаете, что данные будут поступать из сокета.

Обязательно остановите функцию Thread in OnDisable() . НЕ обращайтесь к Unity API из новой функции Thread. Просто делайте там только сокет и возвращайте данные в общедоступную переменную.

 System.Threading.Thread SocketThread; volatile bool keepReading = false; // Use this for initialization void Start() { Application.runInBackground = true; startServer(); } void startServer() { SocketThread = new System.Threading.Thread(networkCode); SocketThread.IsBackground = true; SocketThread.Start(); } private string getIPAddress() { IPHostEntry host; string localIP = ""; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { localIP = ip.ToString(); } } return localIP; } Socket listener; Socket handler; void networkCode() { string data; // Data buffer for incoming data. byte[] bytes = new Byte[1024]; // host running the application. Debug.Log("Ip " + getIPAddress().ToString()); IPAddress[] ipArray = Dns.GetHostAddresses(getIPAddress()); IPEndPoint localEndPoint = new IPEndPoint(ipArray[0], 1755); // Create a TCP/IP socket. listener = new Socket(ipArray[0].AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Bind the socket to the local endpoint and // listen for incoming connections. try { listener.Bind(localEndPoint); listener.Listen(10); // Start listening for connections. while (true) { keepReading = true; // Program is suspended while waiting for an incoming connection. Debug.Log("Waiting for Connection"); //It works handler = listener.Accept(); Debug.Log("Client Connected"); //It doesn't work data = null; // An incoming connection needs to be processed. while (keepReading) { bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); Debug.Log("Received from Server"); if (bytesRec <= 0) { keepReading = false; handler.Disconnect(true); break; } data += Encoding.ASCII.GetString(bytes, 0, bytesRec); if (data.IndexOf("") > -1) { break; } System.Threading.Thread.Sleep(1); } System.Threading.Thread.Sleep(1); } } catch (Exception e) { Debug.Log(e.ToString()); } } void stopServer() { keepReading = false; //stop thread if (SocketThread != null) { SocketThread.Abort(); } if (handler != null && handler.Connected) { handler.Disconnect(false); Debug.Log("Disconnected!"); } } void OnDisable() { stopServer(); } 
Давайте будем гением компьютера.