2009-11-17 104 views
2

我有一个while while循环,它从NetworkStream对象 中读取一个缓冲区,while条件是networkStream.CanRead,只要它能读取,它应该继续从缓冲区读取数据。唯一的问题是,当我从缓冲区读取并转换为字符串时,其中没有任何内容。即它是空的。NetworkStream.CanRead返回true,但缓冲区没有返回值

为什么会发生呢?

这是一个ASP.NET(VS2005)应用

@dtb代码信息:

我传递了一个NetworkStream对象networkStream

// between 2 functions in a loop 
{ 
    SendMessage(networkStream, message); 

    ReadMessage(networkStream); 
} 

有趣的是,如果它重新连接和再次连接,发送/读取工作正常。实际上它可能是Send的问题(我在这里没有得到任何例外),或者重用了NetworkStream对象。这在测试TCP服务器上本地正常工作,但是在生产(Windows Server 2003)时,我遇到了上述问题(即无法从流中读取任何内容 - 直到我实际将其退出(退出循环)之后10秒)

ReadMessage(networkStream) 
{ 
    if (networkStream != null && networkStream.CanRead) 
    { 
     byte[] myReadBuffer = new byte[1024]; 
     StringBuilder myCompleteMessage = new StringBuilder(); 

     do 
     { 
      int numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length); 
      string messageRead = Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead); 
      myCompleteMessage.Append(messageRead); 
     } while (networkStream.CanRead); 
    } 
} 
+0

请注意:它确实在第一次读取消息后,在同一网络流上发送另一个数据请求,这发生在第二次去 – soldieraman 2009-11-17 03:14:18

+1

@soldieraman:如果darkassassin93的回答没有回答您的问题,请向我们展示您的代码。我有这样的感觉,你正在假设有关包边界和/或'Read'方法返回的字节数可能是错误的。 – dtb 2009-11-17 03:19:55

+0

@dtb把一些代码信息 – soldieraman 2009-11-17 05:14:59

回答

4

CanRead是一个静态值,指示该流是否是被读能够DataAvailable属性会让你知道数据是否准备好读取。

+0

+1。这里的“静态值”意味着该值由构造函数设置一次,并且直到类被丢弃时才会被更改(在这种情况下,它将被设置为“false”) – dtb 2009-11-17 03:16:19

+0

在其他有关SO的问题的注释中,CanRead (并且CanWrite也是我想的)可以改变,并且在流关闭时发生。尽管如此,你基本上是对的。 – 2016-11-11 07:07:26