Проверка содержимого NetworkStream с помощью StreamReader - PullRequest
0 голосов
/ 01 ноября 2011

и привет всем участникам.Я работаю над небольшим встроенным оборудованием для сбора данных, которое периодически собирает данные и запускает небольшой встроенный веб-сервер.При запросе сервер отвечает очень простой HTML-страницей, а также собранными данными в 128-байтовых кусках TCP.Размер передаваемых данных не более 64К.

Встроенный стек TCP / IP довольно тонкий, а MCU не самый быстрый, поэтому я бы хотел, чтобы приложение-запросчик имело индикатор прогресса (индикатор выполнения или аналогичный).Поскольку длина передаваемого массива данных постоянно меняется, сервер должен вставить фактическую длину данных в начало массива данных.Запрашивающее приложение должно прочитать эту информацию о длине и обновить ход выполнения.С помощью следующего кода я могу получать содержимое сервера, но могу получить доступ к данным только после завершения передачи:

        TcpClient msnTcpConn = new TcpClient();
        try
        {
            msnTcpConn.Connect(HostName, 80);

            if (msnTcpConn.Connected)
            {

                string msg = "";

                NetworkStream netStream = msnTcpConn.GetStream();
                System.IO.StreamWriter sw = new System.IO.StreamWriter(netStream);
                System.IO.StreamReader sr = new System.IO.StreamReader(netStream);

                string req = "";
                req += "GET / HTTP/1.0\r\n";
                req += "Host: " + HostName + "\r\n";
                req += "\r\n";

                sw.Write(req);
                sw.Flush();
                numa = 0;
                peek = 0;
                while (sr.Peek()>=0)
                {
                    peek = sr.Peek();
                    numa++;
                    textBox1.Text = Convert.ToString(numa);
                    msg += sr.ReadLine();;
                }                 

                webBrowser1.DocumentText = msg;
                msnTcpConn.Close();
            }
            else
            {
                MessageBox.Show("Not connected.");
            }
        }
        catch (UriFormatException UriExc)
        {
            MessageBox.Show("Error!");
        }  

В приведенном выше коде textBox1 не обновляется в цикле while, только когда циклвышел.Таким образом, я не могу вовремя проверить полученные данные, чтобы извлечь размер данных, необходимый для обновления индикатора прогресса.Я новичок в сети .NET, так что, возможно, есть лучший способ сделать это, так что любой совет или помощь будут с благодарностью.Спасибо.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Это проблема с потоками. Пользовательский интерфейс не будет обновляться, пока код, выполненный в потоке пользовательского интерфейса, не будет завершен. Вы захотите переместить ваш код, который читает из NetworkStream, в другой поток. Вам нужно будет убедиться, что ваш код, который пишет в ваш TextBox, делает это в потоке пользовательского интерфейса. Вы можете сделать это с BeginInvoke, если это приложение WinForms.

1 голос
/ 01 ноября 2011

Отредактировано с учетом комментариев OP:

Вам необходимо переместить код чтения netowrk в фоновый рисунок (System.Threading.Thread), а затем вызвать код обновления вашего интерфейса через Dispatcher.BeginInvoke.

...