0

我有一个用作套接字服务器的 Unity 应用程序:

public class Server : MonoBehaviour
{
    private String outData;
    private String inData;

    public void writeData(String data){
        outData = data;
    }

    void Start()
    {       
        ThreadStart ts = new ThreadStart(dataHandler);
        mThread = new Thread(ts);
        mThread.Start();
    }

    void dataHandler()
    {
        TcpListener listener = new TcpListener(PORT);
        listener.Start();

        while (true)
        {
            var client = listener.AcceptTcpClient();
            new Thread(() =>
            {
                using (client)
                {
                    var reader = new StreamReader(client.GetStream());
                    var writer = new StreamWriter(client.GetStream());
                    while (true)
                    {
                        inData = reader.ReadLine();

                        if(outData != null){
                            writer.WriteLine(outData);
                            writer.Flush();
                            outData = null;
                        }
                    }
                }
            }).Start();
        }
    }
}

我不熟悉 .NET 线程,不知道如何发送数据。当数据到来时,socket 线程被唤醒并且 inData 字段更新。但是当我调用 writeData 时,什么也没有发生。套接字线程继续休眠,直到 inData 更新。

4

1 回答 1

1

但是当我调用 writeData 时,什么也没有发生。套接字线程继续休眠,直到 inData 更新。

那是因为你的线程阻塞在inData = reader.ReadLine();. 它将坐在那里,直到它接收到数据(或抛出异常)。只有这样,它才会真正检查传出数据并发送它。

读取数据应该像你一样留在一个单独的线程中,但不需要在你的线程中发送数据。发送数据不是阻塞调用。您的数据将被推送到某个本地缓冲区,并且在将来的某个时候,操作系统将处理其余的事情。你的 write 方法应该更像:

public void writeData(String data)
{
    foreach(StreamWriter clientWriter in ClientWriters)
    {
        clientWriter.WriteLine(outData);
        clientWriter.Flush();
    }
}

其中 ClientWriters 是应在连接/断开连接时维护的列表。还有其他方法可以编写此方法,但基本上,您需要立即发送传出数据。

于 2013-08-08T17:00:38.837 回答