Вопрос по c# – networkStream.Read блокирует

1

Я пишу простое приложение, которое будет соединяться с сервером. Однако я хочу также отправить простые команды чата (см.Console.ReadLine ниже). Однако этот сценарий не дойдет доstring Message = Console.ReadLine(); поскольку он заблокирован наbytesRead = clientStream.Read(message, 0, 4096);.

Я хочу продолжить этот сценарий, но если поступают байты, он должен их обработать (как это происходит сейчас), и если нет поступающих байтов, он должен пройти через сценарий и дождаться ввода данных пользователем). Как этого достичь?

        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        {
            bytesRead = 0;

            try
            {
                // Blocks until a client sends a message                    
                bytesRead = clientStream.Read(message, 0, 4096);
            }
            catch (Exception)
            {
                // A socket error has occured
                break;
            }

            if (bytesRead == 0)
            {
                // The client has disconnected from the server
                break;
            }

            // Message has successfully been received
            ASCIIEncoding encoder = new ASCIIEncoding();

            // Output message
            Console.WriteLine("To: " + tcpClient.Client.LocalEndPoint);
            Console.WriteLine("From: " + tcpClient.Client.RemoteEndPoint);
            Console.WriteLine(encoder.GetString(message, 0, bytesRead));

            // Return message
            string Message = Console.ReadLine();
            if (Message != null)
            {
                byte[] buffer = encoder.GetBytes(Message);
                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
            }

Ваш Ответ

1   ответ
6

DataAvailable свойство. Он скажет вам, есть ли что-нибудь, ожидающее на сокете. Если это неверно, не делайтеRead вызов

А, отлично. Благодарность Devator
Документация гласит, что Read должен вернуть 0, если данные недоступны. Это неправда? Msdn.microsoft.com / EN-US / библиотека / ... Denise Skidmore
@ DeniseSkidmore, я думаю, он вернет 0, только если другая сторона закрыла сокет - то есть, если нет данных и больше не будет. В противном случае он ждет, пока есть что почитать. Joe White
дело в том, что я не хочу, чтобы моя тема чтения былаbusy spinning иDataAvailable является неблокирующим свойством. как мне с этим бороться? Timeless
@ Timeless Это отличается от того, что спросил ОП. Вы должны задать новый вопрос. (Но я дам вам подсказку: ReadAsync.) Joe White

Похожие вопросы