.NET NetworkStream的解决方案.缺少支持的长度
本文关键字:支持 NetworkStream 解决方案 NET | 更新日期: 2023-09-27 18:29:58
。。。基本上正是标题所说的。未实现NetworkStream.Length。还有什么选择?
我正在尝试进行一系列递归的异步回调,以封装对NetworkStream的调用。BeginRead(…)。要知道我何时达到基本情况并接收到所有字节,我需要知道流中的字节长度。有解决办法吗?
代码(此代码的入口点在TcpListen.BeginConceptTcpClient调用之后写入。:
private void StartRead(IAsyncResult ar)
{
try
{
//Do an initial read:
AsyncClient client = (AsyncClient)ar.AsyncState;
int amountRead = 0;
try
{
amountRead = client.ClientStream.EndRead(ar);
}
catch (IOException io)
{
ProcessDebugLog("Async read complete", io);
client.ClientStream.Close();
return;
}
string text = Encoding.UTF8.GetString(client.Bytes, 0, amountRead);
//If TCP segmentation has occurred, more blocks will have
// to get read in:
if (client.ClientStream.Position < client.ClientStream.Length /*EXCEPTION HERE*/)
{
try
{
client.ClientStream.BeginRead(client.Bytes, 0, client.Bytes.Length, StartRead, client);
}
catch (IOException io)
{
ProcessDebugLog("Async read complete", io);
client.ClientStream.Close();
}
}
else
{
client.ClientStream.Close();
}
}
catch (Exception ex)
{
ProcessDebugLog("ERROR - StartRead", ex);
}
}
基本上正是标题所说的。未实现NetworkStream.Length。还有什么选择?
你一直读到最后。没有其他选择-在关闭流之前,总是可以有更多的数据。
如果你控制协议,那么如果一个流可以包含几个"消息",你应该为每个消息加上前缀。(您可以使用分隔符作为替代,但这更混乱。)
请注意,在获得所有数据之前,您应该而不是从二进制解码为文本,或您应该使用能够保持"未完成"字符状态的Decoder
,以防您的读取在一个字符的中途中断。