2012-12-20 1 views
1

J'essaye d'implémenter un serveur TCP dans l'unité. J'utilise unity pro 3.5 et quand je cours ce code dans une scène, puis l'unité se bloque, aucune réponse du tout jusqu'à ce que je le tue avec le gestionnaire de tâches.Unity TCP Server Hang Unity scène

using UnityEngine; 
using System.Collections; 
using System.Net.Sockets; 
using System.Net; 
using System.Text; 


public class Server : MonoBehaviour { 

    private IPAddress ipAd; 
    public string IP="127.0.0.1"; 
    public int port = 8001; 
    private Socket s; 

    void Update() 
    { 

    } 

    // Use this for initialization 
    void Awake() { 
      port = 8001; 
      ipAd = IPAddress.Parse(IP); 
      msg = "Listening at " + IP + ":" + port.ToString(); 
      this.s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      this.s.Bind(new IPEndPoint(ipAd,port)); 
      this.s.Listen(200); 
      while (true) 
       this.ReceiveMessage(this.s.Accept()); //hang if this line activated 
    } 
    private void ReceiveMessage(Socket socket) 
     { 
      byte[] tempbuffer = new byte[10000]; 
      socket.Receive(tempbuffer); 
      rec.AssignFromByteArray(tempbuffer);     
     } 
} 

Répondre

2

Server doit fonctionner dans son propre fil de sorte que le GameLoop peut se poursuivre même si tcp_Listener.AcceptSocket() est un appel de blocage.

using UnityEngine; 
using System.Collections; 
using System.Threading; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 

public class Server : MonoBehaviour { 
    private bool mRunning; 
    public static string msg = ""; 

    public Thread mThread; 
    public TcpListener tcp_Listener = null; 

    void Awake() { 
     mRunning = true; 
     ThreadStart ts = new ThreadStart(Receive); 
     mThread = new Thread(ts); 
     mThread.Start(); 
     print("Thread done..."); 
    } 

    public void stopListening() { 
     mRunning = false; 
    } 

    void Receive() { 
     tcp_Listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8001); 
     tcp_Listener.Start(); 
     print("Server Start"); 
     while (mRunning) 
     { 
      // check if new connections are pending, if not, be nice and sleep 100ms 
      if (!tcp_Listener.Pending()){ 
       Thread.Sleep(100); 
      } 
      else { 
       Socket ss = tcp_Listener.AcceptSocket(); 
       BonePos rec = new BonePos(); 
       byte[] tempbuffer = new byte[10000]; 
       ss.Receive(tempbuffer); // received byte array from client 
       rec.AssignFromByteArray(tempbuffer); // my own datatype 
      } 
     } 
    } 

    void Update() { 

    } 

    void OnApplicationQuit() { // stop listening thread 
     stopListening();// wait for listening thread to terminate (max. 500ms) 
     mThread.Join(500); 
    } 
} 

Voir Related answer from answers.unity3d.com

+0

'mRunning' devrait être volatile. La variable est définie par le thread Unity et lue à partir du thread de réception. L'accès doit donc être synchronisé. – Vertex

Questions connexes