我有一种方法可以通过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);
对此有何见解?
答案 0 :(得分:4)
NetworkStream.DataAvailable
属性不是检测响应结束的可靠方法;如果响应被分成多个TCP数据包并且在您检查DataAvailable
时尚未传送数据包,则该属性将返回false,过早终止您的循环。
显然,您的网络连接足够快,Thread.Sleep(1)
为每个连续的数据包提供足够的时间。但是,在较慢的连接上,它可能不够。
为了进行可靠的通信,客户端和服务器需要就表示响应结束的方式达成一致。例如: