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)
DataAvailable只是告诉你什么是缓冲和本地可用.对于可能到达的内容而言,这意味着什么都没有.最常见的用途DataAvailable是决定同步读取和异步读取.
如果您希望在发送后关闭入站流,那么您可以继续使用,Read直到获得非肯定结果,这表明它已到达结束.如果他们发送多个帧,或者只是没有关闭 - 那么是:你需要某种方法来检测帧的结束(=逻辑消息).这可以通过长度前缀和计数,但也可以通过sentinel值.例如,在基于文本的协议中,\n或者\r通常被解释为"消息结束".
所以:这完全取决于你的协议.