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

时间:2013-10-15 20:31:45

标签: c# networking

我正在尝试让我的客户端应用程序从服务器读取响应,而我在这里抓住某个概念时遇到了麻烦。

根据我所做的研究,你必须具有从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字节呢?什么?

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

2 个答案:

答案 0 :(得分:1)

你需要循环,同时NetworkStream.DataAvailable为true;看到这里:

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

答案 1 :(得分:1)

您需要在发送方和接收方之间建立某种预先商定的方案(协议),以确定“消息结束”。

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

另一种方法是使用一个特定的字节序列来表示消息的结束。例如,接收器继续读入,直到它看到<EOF>的ascii字节。

请勿使用DataAvailable,因为您很可能会以块的形式收到邮件,因此DataAvailable可能会在收到完整邮件之前变为false。