首页 > 解决方案 > 重写 Text.text 会表现得很奇怪

问题描述

重写 Text.text 会表现得很奇怪。

我正在使用 Text 组件的文本在 Unity 的游戏屏幕上显示日志。由于 TCP 接收到的是异步操作,所以 Log 被放入队列一次,在 Update 方法中检索并显示。

    private void Update()
    {
            if (LogQueue.Count > 0)
            {
                var msg = LogQueue.Dequeue();
                Debug.Log(msg);
                LogText.text = msg + "\n" + LogText.text;            
            }
    }
    public void CreateServer()
    {
            var portText = IpInput.text;            
            var port = int.Parse(portText);            
            server = new TcpListener(IPAddress.Any,port);
            server.Start();
            server.BeginAcceptTcpClient(new AsyncCallback(AcceptClientCallback), server);
            LogQueue.Enqueue($"Server listening on port {port}");
            LogQueue.Enqueue($"wait client ...");   
    }

    private void AcceptClientCallback(IAsyncResult ar)
    {
            var listener = (TcpListener)ar.AsyncState;
            client = listener.EndAcceptTcpClient(ar);            
            stream = client.GetStream();

            var msg = System.Text.Encoding.ASCII.GetBytes("connected");
            stream.Write(msg, 0, msg.Length);
            LogQueue.Enqueue("connectd");

            var buffer = new byte[128];
            stream.BeginRead(buffer, 0, buffer.Length, ReadStreamCallBack, buffer);      
    }

    private void ReadStreamCallBack(IAsyncResult ar)
    {
            Debug.Log("called");
            var buffer = (byte[])ar.AsyncState;            
            var msg = System.Text.Encoding.ASCII.GetString(buffer, 0, buffer.Length);

            LogQueue.Enqueue(msg);            

            var back = System.Text.Encoding.ASCII.GetBytes("received");
            stream.Write(back, 0, back.Length);

            var nextBuffer = new byte[128];
            stream.BeginRead(nextBuffer, 0, nextBuffer.Length, ReadStreamCallBack, nextBuffer);
    }

实际执行时,同步处理的日志正确显示如下。

sync log 1
sync log 2
sync log 1
sync log 3
sync log 2
sync log 1

但是,当开始显示与TCP异步接收的消息的日志时,之前的日志就消失了,只显示最新的日志。

received message 1
received message 2
received message 3

为什么会这样?

标签: c#unity3dtcp

解决方案


删除空字符或仅接收所需的长度。

移动: str = str.TrimEnd ('\ 0');


推荐阅读