2013-10-15 86 views
0

我試圖讓我的客戶端應用程序從服務器讀取響應,並且我真的無法在此處理某種概念。從NetworkStream.Read()獲取正確的字節數並將它們放在緩衝區中

據研究我已經做了,你必須有個字節的長度從NetworkStream讀你實際上可以讀取數據之前。這對我來說毫無意義。在到達那裏之前,你應該怎麼知道有多少數據要進入?

此代碼:

using (var stream = client.GetStream()) 
{ 
    stream.Write(data, 0, data.Length); 
    stream.Flush(); 

    Console.WriteLine("Data sent.\n"); 

    Console.WriteLine("Reading response...\n"); 

    byte[] buffer = new byte[1024]; 

    int bytesRead = stream.Read(buffer, 0, buffer.Length); 
} 

讀取1024個字節與一組大小的緩衝器。那麼如果來自服務器的響應有更多比1024字節呢?那又怎麼樣?

如果有人能幫助我理解這個概念,我會非常感激。

+0

這就是爲什麼服務器應該告訴你它發送了多少字節。或者,只要繼續閱讀,直到你用完了再見。 – SLaks

回答

1

你需要有某種形式的發送者和接收者確定「消息的結束」之間預先同意的方案(協議)的。

通常這是通過使用包含消息長度的標頭開始消息來完成的。例如,雙方可以同意前4個字節確定傳入消息的長度,所以接收器讀取那麼多字節。

另一種方法是具有表示消息結束的特定字節序列。例如,接收器繼續閱讀,直到看到<EOF>的ascii字節。

請勿使用DataAvailable,因爲您很可能收到大塊內容的消息,因此DataAvailable在您收到完整消息之前可能會變爲false。

+0

你可以提供某種關於'DataAvailable'的聲明嗎?如果連接關閉或遠程主機關閉,MSDN僅指定它將變爲false或拋出異常。 – Kehlan

相關問題