2012-04-03 71 views
0

......基本上标题所说的是什么。 NetworkStream.Length未实现。什么是替代方案?.NET 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); 
    } 
} 
+1

你是否控制连接的两端? – 2012-04-03 20:07:46

+2

有些流真的是流。你不知道那条河里有多少水,直到水耗尽。 – 2012-04-03 20:17:23

+0

@Boo是的我控制双方。 – kmarks2 2012-04-03 20:20:07

回答

3

后写...标题说基本上什么。NetworkStream.Length未实现。什么是替代?

你继续读,直到流的末尾有无可奈何本 - 直到流已关闭,其实都可以找到更多的数据

01。

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

请注意,您应该二进制不解码文本,直到你所有的数据,你应该使用Decoder这是能够保持“未完成”角色的状态 - 以防你的阅读最终在角色中分裂一半。

+0

谢谢。由于消息的长度可能有很大差异,因此我将使用分隔符路由。我控制所有的客户,这样我就可以缓解这个混乱。我正在做一个FileStream的例子,所以它没有立即发生,为什么长度是一个问题,但你是完全正确的。 Upvoted /解决。 – kmarks2 2012-04-03 20:12:31

+2

@ kmarks2:为什么他们的长度变化很大,建议使用分隔符?如果发送代码在开始发送该消息之前知道该长度,则使用长度前缀可能会变得非常干净。 – 2012-04-03 20:13:38

+0

部署的客户端会中断。而且它们都以相同的方式终止,这是我忽略的。如果我不得不更新客户端,我可能会错过一些导致破坏的事件。 – kmarks2 2012-04-03 20:28:17

相关问题