......基本上就是标题所说的内容。 NetworkStream.Length未实现。还有什么选择?
我正在尝试制作一系列递归回调,这些回调包含对NetworkStream.BeginRead(...)的调用。要知道我何时遇到基本情况并收到所有字节,我需要知道流中的字节长度。有解决方法吗?
代码(此代码的入口点是在TcpListern.BeginAcceptTcpClient调用之后写入。:
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);
}
}
答案 0 :(得分:3)
......基本上就是标题所说的内容。 NetworkStream.Length未实现。还有什么选择?
你继续阅读直到流的结尾。 无法替代 - 在关闭流之后,总会有更多数据。
如果您控制协议,那么如果流可以包含多个“消息”,则应对每条消息进行长度前缀。 (您可以使用分隔符作为替代,但这更麻烦。)
请注意,在获得所有数据或之前,你应不从二进制文件解码到,你应该使用Decoder
保持“未完成”字符的状态 - 如果你的阅读最终在角色中途分裂。