2009-11-17 82 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

相關問題