Попытка чтения из программы NetworkStream дает сбой, без исключений и ошибок - PullRequest
1 голос
/ 19 марта 2012

Я пытаюсь прочитать данные из сокета, однако всякий раз, когда я пытаюсь прочитать весь поток, моя программа зависает. Без ошибок или исключений.

Я могу вручную прочитать, скажем, 4 байта, и это будет работать, однако я больше не знаю точный размер данных, которые будет отправлять сервер, поэтому я хочу прочитать весь поток. Что я делаю не так?

Зависает при вызове ReadToEnd ().

Stream input = socket.GetStream();

byte[] request = new byte[5];

input.Write(request, 0, 5); //send request

StreamReader reader = new StreamReader(input);

if (input.CanRead == true)
{
    string test = reader.ReadToEnd();
}

1 Ответ

1 голос
/ 19 марта 2012

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

    public class Server
    {
        private readonly Thread _listenThread;
        private readonly TcpListener _tcpListener;

        public Server()
        {
            _tcpListener = new TcpListener(IPAddress.Any, 3000);
            _listenThread = new Thread(Listen);
            _listenThread.Start();
        }

        private void Listen()
        {
            var tcpListener = _tcpListener;

            if (tcpListener != null)
            {
                tcpListener.Start();
            }

            while (true)
            {
                TcpClient client = _tcpListener.AcceptTcpClient();
                Console.Out.WriteLine("Connection Accepted");
                Thread clientThread = new Thread(DoWork);
                clientThread.Start(client);
            }
        }

        private void DoWork(object client)
        {
            TcpClient tcpClient = client as TcpClient;

            if (tcpClient == null)
            {
                throw new ArgumentNullException("client", "Must pass client in");
            }

            using (NetworkStream clientStream = tcpClient.GetStream())
            {
                byte[] message = new byte[1024];

                while (true)
                {
                    Console.Out.WriteLine("Waiting for message");
                    int bytesRead = clientStream.Read(message, 0, 1024);

                    if (bytesRead == 0)
                    {
                        break;
                    }

                    ASCIIEncoding encoder = new ASCIIEncoding();
                    string received = encoder.GetString(message, 0, bytesRead);

                    Console.Out.WriteLine(String.Format("Read {0}", received));
                    if (received.Equals("Hello Server !"))
                    {
                        byte[] buffer = encoder.GetBytes("Hello Client!");
                        clientStream.Write(buffer, 0, buffer.Length);
                        clientStream.Flush();
                    }
                }
            }
        }
    }

Вам понадобится клиент, который сделал что-то вроде этого

    static void Main(string[] args)
    {
        try
        {

            using (TcpClient clientSock = new TcpClient(IPAddress.Loopback.ToString(), 3000))
            {
                using (Stream clientStream = clientSock.GetStream())
                {
                    ASCIIEncoding encoder = new ASCIIEncoding();
                    byte[] helloMessage = encoder.GetBytes("Hello Server !");

                    clientStream.Write(helloMessage, 0, helloMessage.Length);
                    clientStream.Flush();

                    using (StreamReader streamReader = new StreamReader(clientStream))
                    {
                        while(true)
                        {
                            char[] buffer = new char[1024];
                            streamReader.Read(buffer,0, 1024);

                            Console.Out.WriteLine(new string(buffer));
                        }
                    }
                }
            }

            Console.ReadLine();
        }
        catch (Exception)
        {
            // do something here

            throw;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...