当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();
}
答案 0 :(得分:6)
DataAvailable
只是告诉你什么是本地缓冲和可用的。就可能到达的内容而言,它意味着完全没有。 DataAvailable
最常见的用途是决定同步读取和异步读取。
如果您希望发送后入站流关闭,那么您可以继续使用Read
,直到获得非肯定结果,这会告诉您已达到结束。如果他们发送多个帧,或者只是没有关闭 - 那么是:你需要某种方法来检测帧的结束(=逻辑消息)。 可以通过长度前缀和计数,但它也可以通过哨兵值。例如,在基于文本的协议中,\n
或\r
通常被解释为“消息结束”。
所以:这完全取决于你的协议。
答案 1 :(得分:0)
最简单的方法是拥有一个开始/结束字符,因此消息将是:
string message = "Hello";
string messageToSend = (char)2 + message + (char)3;