从 NetworkStream.Read() 获取正确的字节数,并将它们放在缓冲区中

本文关键字:缓冲区 字节数 Read NetworkStream 获取 | 更新日期: 2023-09-27 18:35:25

我试图让我的客户端应用程序从服务器读取响应,但我真的很难在这里掌握某个概念。

根据我所做的研究,实际读取数据之前,您必须具有从NetworkStream读取的字节长度。这对我来说意义不大。您如何知道有多少数据在到达那里之前

就进入了那里?

此代码:

using (var stream = client.GetStream())
{
    stream.Write(data, 0, data.Length);
    stream.Flush();
    Console.WriteLine("Data sent.'n");
    Console.WriteLine("Reading response...'n");
    byte[] buffer = new byte[1024];
    int bytesRead = stream.Read(buffer, 0, buffer.Length);
}

将 1024 字节读入具有设定大小的缓冲区。那么,如果来自服务器的响应超过 1024 字节怎么办?然后呢?

如果有人能帮助我掌握这个概念,我将非常感激。

从 NetworkStream.Read() 获取正确的字节数,并将它们放在缓冲区中

您需要在 NetworkStream.DataAvailable 为 true 时进行循环;请参阅此处:

http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read.aspx

你需要在

发送方和接收方之间有某种预先商定的方案(协议),以确定"消息结束"。

通常,这是通过以包含消息长度的标头开始消息来完成的。例如,双方可以同意前 4 个字节确定传入消息的长度,因此接收方读取这么多字节。

另一种方法是具有表示消息结束的特定字节序列。例如,接收器不断读入,直到看到 <EOF> 的 ASCII 字节。

不要使用 DataAvailable,因为您很可能以块的形式收到消息,因此DataAvailable在收到完整消息之前可能会变为 false。