.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);
   }
}

.NET NetworkStream的解决方案.缺少支持的长度

基本上正是标题所说的。未实现NetworkStream.Length。还有什么选择?

你一直读到最后。没有其他选择-在关闭流之前,总是可以有更多的数据。

如果你控制协议,那么如果一个流可以包含几个"消息",你应该为每个消息加上前缀。(您可以使用分隔符作为替代,但这更混乱。)

请注意,在获得所有数据之前,您应该而不是从二进制解码为文本,您应该使用能够保持"未完成"字符状态的Decoder,以防您的读取在一个字符的中途中断。