当dataavailable为false时,是否确保从网络流中读取所有数据?
或者数据的发送者必须首先发送数据的长度。
我必须读到直到我读到发送者指定的字节数?
萨佩尔:

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();
}

最佳答案

DataAvailable只告诉您哪些是缓冲的,哪些是本地可用的。就可能到达的地方而言,这完全没有意义。DataAvailable最常见的用途是决定同步读取和异步读取。
如果您希望入站流在发送之后关闭,那么您可以继续使用Read,直到获得非正结果,这将告诉您它已经到达了终点。如果它们发送多个帧,或者只是不关闭—那么是的:您需要某种方法来检测帧的结尾(=逻辑消息)。这可以通过长度前缀和计数实现,但也可以通过sentinel值实现。例如,在基于文本的协议中,\n\r通常被解释为“消息结束”。
所以:这完全取决于你的协议。

09-11 19:57