2

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

还是数据的发送者必须先发送数据的长度。我必须阅读,直到我阅读了发送者指定的字节数?

样品:

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

2 回答 2

6

DataAvailable只是告诉您在本地缓冲和可用的内容。就可能到达的情况而言,这完全没有任何意义。最常见的用途DataAvailable是在同步读取和异步读取之间做出决定。

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

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

于 2013-02-05T14:29:40.357 回答
0

最简单的方法是有一个开始/结束字符,所以消息是:

string message = "Hello";
string messageToSend = (char)2 + message + (char)3;
于 2013-02-05T14:32:21.890 回答