NetworkStream在Unity中接收到一个空字符串数据

NetworkStream receives an empty string data in Unity

I 运行 Unity 上的客户端代码和控制台应用程序上的服务器代码。问题是,当服务器向客户端发送 'welcome' 消息时,客户端收到一条空消息。但奇怪的是,当我 运行 在 调试模式 Unity 上的代码时,它运行良好。有谁知道为什么会这样?

这是客户端代码

    public class Test: MonoBehaviour
    {
        TcpClient client;
        NetworkStream networkStream;        
        string stringData;
        byte[] data;

        private void Start()
        {
            StartClient();
        }

        private void OnApplicationQuit()
        {
            if (networkStream != null)
            {
                if (networkStream.CanRead && networkStream.CanWrite) networkStream.Close();
            }

            if (client.Connected) client.Close();
        }

        private void StartClient()
        {
            client = new TcpClient();
            client.BeginConnect("127.0.0.1", 7777, DefaultConnectCallback, client);            
        }

        private void DefaultConnectCallback(IAsyncResult ar)
        {
            TcpClient client = (TcpClient)ar.AsyncState;

            networkStream = client.GetStream();
            data = new byte[1024];
            networkStream.BeginRead(data, 0, data.Length, DefaultReadCallback, networkStream);
            stringData = System.Text.Encoding.ASCII.GetString(data).Trim('[=10=]');
            Log.LogMessage("Recieved a message");
            Log.LogMessage(stringData);
            Log.LogMessage($"{stringData.Length}");            
        }

        private void DefaultReadCallback(IAsyncResult ar)
        {
            NetworkStream networkStream = (NetworkStream)ar.AsyncState;
            networkStream.EndRead(ar);
        }
    }

这是服务器代码

class Program
    {        
        public static Action OnExit;

        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);

            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 7);
            listener.Start();   
            Log.LogMessage("Server Started");

            OnExit += () => 
            {
                foreach(var client in clients)
                {
                    client?.GetStream()?.Close();
                }

                listener.Stop();
            };

            listener.BeginAcceptTcpClient(DefaultAcceptCallback, listener);            

            Console.ReadKey();
        }                

        static void OnProcessExit(object sender, EventArgs e)
        {                
            if (OnExit != null) OnExit();    
        }

        static TcpClient[] clients = new TcpClient[10];
        static int connection = 0;

        static void DefaultAcceptCallback(IAsyncResult ar)        
        {
            TcpListener listener = (TcpListener)ar.AsyncState;
            TcpClient newClient = listener.EndAcceptTcpClient(ar);
            NetworkStream networkStream = newClient.GetStream();
            byte[] welcome;

            Log.LogMessage($"Connect request No.{connection} accepted");            
            clients[connection] = newClient;
            welcome = Encoding.ASCII.GetBytes("Welcome!");
            networkStream.BeginWrite(welcome, 0, welcome.Length, DefaultReadCallback, networkStream);
            Log.LogMessage($"Welcome message sent");
            connection++;
            listener.BeginAcceptTcpClient(DefaultAcceptCallback, listener);
        }

        static void DefaultWriteCallback(IAsyncResult ar)
        {
            NetworkStream networkStream = (NetworkStream)ar.AsyncState;
            networkStream.EndWrite(ar);
        }
    }    

networkStream.BeginRead(data, 0, data.Length, DefaultReadCallback, networkStream);
    

是一个非阻塞调用,您可以立即继续您的代码。

您必须等到真正收到东西!

    private void DefaultConnectCallback(IAsyncResult ar)
    {
        TcpClient client = (TcpClient)ar.AsyncState;

        networkStream = client.GetStream();
        data = new byte[1024];
        networkStream.BeginRead(data, 0, data.Length, DefaultReadCallback, networkStream);
    }

    private void DefaultReadCallback(IAsyncResult ar)
    {
        NetworkStream networkStream = (NetworkStream)ar.AsyncState;
        networkStream.EndRead(ar);

        stringData = System.Text.Encoding.ASCII.GetString(data).Trim('[=11=]');
        Log.LogMessage("Recieved a message");
        Log.LogMessage(stringData);
        Log.LogMessage($"{stringData.Length}");            
    }

NetworkStream.BeginRead and also the example of NetworkStream.EndRead