Есть ли функция .ReadLine () для NetworkStream или что-то подобное? - PullRequest
2 голосов
/ 06 июня 2019

Я новичок в TCP-клиентах и ​​связи с хостами, поэтому извините, если это выглядит как глупый вопрос.

Я создаю приложение Serial / TCP, которое связывается с устройствами. Поскольку я уже написал большую часть кода для последовательной части приложения, а TCP - моя новая задача, я стараюсь сделать его совместимым друг с другом. Когда я общаюсь с последовательными устройствами, я получаю данные, используя .ReadLine(), но NetworkStream (который я использую для получения данных с хоста) не имеет этой функции. Есть ли способ реализовать или написать эту функцию самостоятельно?

Все, что мне удалось сделать, это извлечь данные из NetworkStream в байтовом массиве, а затем преобразовать их в ASCII, но этот подход мне не подходит ...

Edit:

        private void Button_TCP_Connect_Click(object sender, EventArgs e)
        {
            try
            {
                Int32 port = Convert.ToInt32(TextBox_TCP_Port.Text);
                String server = TextBox_TCP_Server.Text;
                var IP = IPAddress.Parse(TextBox_TCP_Host.Text);

                TCP = new TcpClient();
                TCP.Connect(IP, port);

                if (TCP.Connected)
                {
                    TextBox_System_Log.Text = "***CONNECTED***" + Environment.NewLine + "Host: " + IP.ToString()
                        + Environment.NewLine + "Port: " + port.ToString() + Environment.NewLine;
                    tcpConnection = true;


                    Stream = TCP.GetStream();

                    Timer_NetworkStream.Enabled = true;
                    Timer_NetworkStream.Start();

                    byte[] buffer = new byte[4096];

                    Stream.BeginRead(buffer, 0, buffer.Length, ReadComplete, buffer);
                }
            }
            catch (SocketException exception)
            {
                MessageBox.Show(exception.ToString());
            }
        }
            void ReadComplete(IAsyncResult iar)
            {

                byte[] buffer = (byte[])iar.AsyncState;

                int bytesAvailable = Stream.EndRead(iar);

                int lastIndex = Array.FindLastIndex(buffer, b => b != 0);
                Array.Resize(ref buffer, lastIndex + 1);
                SetText(System.Text.Encoding.ASCII.GetString(buffer));

            Stream.BeginRead(buffer, 0, buffer.Length, ReadComplete, buffer);
        }

Я добавил свой код, который я использую для создания TCP client, и мой NetworkStream. Поскольку он не основан на событиях, и я постоянно получаю данные от хоста, я использовал .BeginRead() в качестве обходного пути, который срабатывает при получении данных. StreamReader не кажется хорошим вариантом, потому что он использует циклы для перебора строк, и это заморозило бы графический интерфейс моего приложения. Помещение StreamReader в BackgroundWorker не вариант, так как он уже используется моим приложением.

1 Ответ

5 голосов
/ 06 июня 2019

Если nws ваш поток, то

var reader = new StreamReader(nws);
var myString = reader.ReadLine();

делает то, что вы хотите.

...