因此,它似乎是一個阻塞read()方法可以返回它完成接收的所有數據被髮送給它之前。接下來,我們將Read()與由來自相關流中的DataAvailable值控制的循環一起包裝。問題是,在這個while循環中你可以接收更多的數據,但是沒有幕後處理讓系統知道這一點。我在網上發現的大多數解決方案都不適用於我。TcpClient.GetStream()。DataAvailable返回false,但流具有更多的數據
我已經落得這樣做是因爲我在循環中的最後一步,我從流中讀取每個塊後做了一個簡單的Thread.Sleep(1)。這似乎給系統更新時間,並且我沒有得到準確的結果,但是這對於解決方案來說似乎有點難以理解,並且相當「有條件」。
這裏是我處理的情況列表:IIS應用程序和獨立的應用程序,無論是用C#編寫的發送之間單一的TCP連接/接收通信。它發送一個請求,然後等待響應。這個請求是由一個HTTP請求發起的,但是我沒有從HTTP請求中讀取數據的問題,這是事實。
下面是用於處理傳入連接的基本代碼
protected void OnClientCommunication(TcpClient oClient)
{
NetworkStream stream = oClient.GetStream();
MemoryStream msIn = new MemoryStream();
byte[] aMessage = new byte[4096];
int iBytesRead = 0;
while (stream.DataAvailable)
{
int iRead = stream.Read(aMessage, 0, aMessage.Length);
iBytesRead += iRead;
msIn.Write(aMessage, 0, iRead);
Thread.Sleep(1);
}
MemoryStream msOut = new MemoryStream();
// .. Do some processing adding data to the msOut stream
msOut.WriteTo(stream);
stream.Flush();
oClient.Close();
}
一個更好的解決方案或只是需要給該睡眠(1)一去,讓事情順利更新一個豎起大拇指的所有反饋歡迎在我們檢查DataAvailable值之前。
猜猜我是2年後希望回答this question也不怎麼東西還都是:)
你最終實現了什麼?你是否堅持線程睡眠?我有一個類似的問題:http://stackoverflow.com/questions/36731247/c-sharp-networkstream-dataavailable-seems-to-be-unreliable – joelc 2016-04-19 23:39:30
是的,這只是這些圖書館的工作方式。他們需要時間運行以完全驗證數據傳入。 – James 2016-04-20 05:24:23