![](/img/trans.png)
[英]NetworkStream doesn't always send data unless I Thread.Sleep() before closing the NetworkStream. What am I doing wrong?
[英]TcpClient's NetworkStream reads incomplete data unless Thread.Sleep(1) is called
我有一种方法,该方法通过TcpClient
的NetworkStream
读取一些数据,它给了我一些错误。
在调查过程中,我发现它实际上可以正常工作……但前提是我使用断点在Visual Studio 2012的调试器中逐步完成了代码。
这是我的代码:
public static byte[] DownloadStream(string hostname, int port,
byte[] requestBytes, int bufferSize = 4096)
{
byte[] responseBytes = null;
var client = new System.Net.Sockets.TcpClient(hostname, port);
if (client.Connected)
{
using (var stream = client.GetStream())
{
stream.Write(requestBytes, 0, requestBytes.Length);
stream.Flush();
if (stream.CanRead)
{
var responseStream = new System.IO.MemoryStream();
byte[] buffer = new byte[bufferSize];
int bytesRead = 0;
do
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
responseStream.Write(buffer, 0, bytesRead);
}
while (stream.DataAvailable);
responseBytes = responseStream.ToArray();
}
}
}
client.Close();
return responseBytes;
}
这是非常令人沮丧的,因为没有真正的错误。 显然,它只需要调试器在读取NetworkStream
时握住它的手即可。
有人知道为什么会这样吗? 我该如何解决?
编辑:
由于某些原因,进行此更改可以消除此问题:
do
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
responseStream.Write(buffer, 0, bytesRead);
System.Threading.Thread.Sleep(1); //added this line
}
while (stream.DataAvailable);
有什么见解吗?
NetworkStream.DataAvailable
属性不是检测响应结束的可靠方法。 如果将响应拆分为多个TCP数据包,并且在您检查DataAvailable
尚未发送数据包,则该属性将返回false,从而提前终止循环。
显然,您的网络连接速度足够快,以便Thread.Sleep(1)
为每个后续数据包到达提供足够的时间。 但是,在连接速度较慢的情况下,这可能不够用。
为了进行可靠的通信,客户端和服务器需要就发出信号通知响应结束的方式达成共识。 例如:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.