0

...基本上正是标题所说的。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);
   }
}
4

1 回答 1

3

...基本上正是标题所说的。NetworkStream.Length 未实现。有什么替代方案?

您继续阅读直到流结束。没有其他选择 - 在流关闭之前,总是可以有更多数据。

如果您控制协议,那么如果一个流可以包含多个“消息”,您应该为每条消息添加长度前缀。(您可以使用分隔符作为替代,但这更麻烦。)

请注意,在获得所有数据之前,您不应该二进制解码为文本,或者您应该使用Decoder能够保持“未完成”字符状态的 a ——以防您的读取最终在字符中途分裂。

于 2012-04-03T20:07:44.690 回答