当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
通常被解释为“消息结束”。
所以:这完全取决于你的协议。