如何确保从NetworkStream读取所有数据

时间:2013-02-05 14:25:25

标签: c# tcp networkstream

当DataAvailable为false时,确保从NetworkStream读取所有数据吗?

或者数据发送方必须先发送数据长度。 我必须阅读,直到我读取发件人指定的字节数?

Sampel:

private Byte[] ReadStream(NetworkStream ns)
{
    var bl = new List<Byte>();
    var receivedBytes = new Byte[128];
    while (ns.DataAvailable)
    {
            var bytesRead = ns.Read(receivedBytes, 0, receivedBytes.Length);
            if (bytesRead == receivedBytes.Length)
                bl.AddRange(receivedBytes);
            else
                bl.AddRange(receivedBytes.Take(bytesRead));
    }
    return bl.ToArray();
}

2 个答案:

答案 0 :(得分:6)

DataAvailable只是告诉你什么是本地缓冲和可用的。就可能到达的内容而言,它意味着完全没有DataAvailable最常见的用途是决定同步读取和异步读取。

如果您希望发送后入站流关闭,那么您可以继续使用Read,直到获得非肯定结果,这会告诉您已达到结束。如果他们发送多个帧,或者只是没有关闭 - 那么是:你需要某种方法来检测帧的结束(=逻辑消息)。 可以通过长度前缀和计数,但它也可以通过哨兵值。例如,在基于文本的协议中,\n\r通常被解释为“消息结束”。

所以:这完全取决于你的协议。

答案 1 :(得分:0)

最简单的方法是拥有一个开始/结束字符,因此消息将是:

string message = "Hello";
string messageToSend = (char)2 + message + (char)3;