使用StreamReader检查NetworkStream内容

本文关键字:内容 NetworkStream 检查 StreamReader 使用 | 更新日期: 2023-09-27 18:12:54

向各位成员致以良好的问候。我正在研究一个小型嵌入式数据采集硬件,它定期收集数据并运行一个小型嵌入式web服务器。如果被请求,服务器将返回一个非常基本的html页面以及128字节的TCP块收集的数据。传输的数据大小不超过64K。

嵌入式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网络的初学者,所以也许有更好的方法来做这件事,所以任何建议或帮助都将非常感谢。谢谢你。

使用StreamReader检查NetworkStream内容

这是线程问题。在UI线程上执行的代码完成之前,UI不会更新。您将希望将从NetworkStream读取的代码移动到另一个线程。你需要确保你的代码写你的TextBox这样做的UI线程。如果这是一个WinForms应用,你可以用BeginInvoke来实现。

编辑以回应OPs的评论:

你需要将你的网络读取代码移动到后台线程(System.Threading.Thread),然后通过Dispatcher.BeginInvoke.

调用你的UI更新代码。