3

ユニティでTCPサーバーを実装しようとしています。私が使用してunity pro 3.5いて、シーンでこのコードを実行すると、Unity がハングし、タスク マネージャーで強制終了するまでまったく応答がありません。

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);                
        }
}
4

3 に答える 3

2

tcp_Listener.AcceptSocket()サーバーは独自のスレッドで実行する必要があるため、ブロック呼び出しであっても GameLoop を続行できます。

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);
    }
}

answer.unity3d.com からの関連する回答を参照してください

于 2012-12-20T16:42:32.097 に答える