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

mus*_*ium 2 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();
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

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

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

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

  • @Royi替代可视化:您是一扇门的一面,而您的朋友是另一面。他有一本想要的书,但是那本书太大了。因此,他正在撕开每页并将其通过信件槽张贴。当您停止查看页面时,便绑定了这本书。在前几章中一切顺利,直到您的朋友停下来半秒钟绑鞋带。您不再看到准备就绪的页面,所以就走开了。您的书现在结束了一半,中间句子。 (2认同)