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 スレッドに詳しくなく、データを送信する方法がわかりません。データが来ると、ソケット スレッドが起動し、inData フィールドが更新されます。しかし、writeData を呼び出しても何も起こりません。inData が更新されるまで、ソケット スレッドは引き続きスリープ状態になります。

4

1 に答える 1

1

しかし、writeData を呼び出しても何も起こりません。inData が更新されるまで、ソケット スレッドは引き続きスリープ状態になります。

これは、スレッドが でブロックされているためinData = reader.ReadLine();です。データを受信する (または例外がスローされる) までそこに留まります。そうして初めて、実際に発信データをチェックして送信します。

データの読み取りは、あなたが持っているように別のスレッドに残す必要がありますが、スレッドでデータを送信する必要はありません。データの送信はブロッキング コールではありません。データはローカル バッファにプッシュされ、将来のある時点で OS が残りを処理します。write メソッドは次のようになります。

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

ClientWriters は、接続/切断時に保持する必要があるリストです。このメソッドを記述する方法は他にもありますが、基本的には送信データをすぐに送信する必要があります。

于 2013-08-08T17:00:38.837 に答える