使用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网络的初学者,所以也许有更好的方法来做这件事,所以任何建议或帮助都将非常感谢。谢谢你。
这是线程问题。在UI线程上执行的代码完成之前,UI不会更新。您将希望将从NetworkStream读取的代码移动到另一个线程。你需要确保你的代码写你的TextBox这样做的UI线程。如果这是一个WinForms应用,你可以用BeginInvoke来实现。
编辑以回应OPs的评论:
你需要将你的网络读取代码移动到后台线程(System.Threading.Thread),然后通过Dispatcher.BeginInvoke.