2014-04-04 45 views
1

我的服務器將使用networkStream.Write(messageBytes)發送消息;所有數據寫入前的網絡流讀取

我的客戶端將使用networkStream.Read()接收消息。客戶端將逐字節地讀取一個序列,當它找到它讀取頭部其餘部分的序列時。

頭部包含有效載荷長度。一旦我有了這個,我使用有效載荷長度讀取流來獲得有效載荷。

我的問題是,當我寫入數據時,我的客戶端會嘗試立即讀取,並且所有數據可能沒有被寫入。

所以我結束了與結束的消息有效砍掉:

「blablablablabl \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0「

無論如何要等待所有的信息被接收?

謝謝。

回答

2

這沒有什麼意義。套接字讀取函數告訴你有多少數據可用/已被讀入緩衝區,所以如果你正在緩衝區中處理一堆NUL,因爲還沒有收到其餘的數據,這是因爲你沒有檢查已收到大量數據。如果您希望得到更多的數據,請繼續接收,直到達到預期的程度(避免將指針前進到接收緩衝區或複製到新的緩衝區等內容覆蓋之前接收的區塊)。

+0

好的,所以不要讀取標題信息,獲取有效載荷長度,然後進行讀取(並非所有內容都已經進入)。 有一些邏輯檢查有效載荷長度是否比讀入的長度大,然後等待? – mitchellt

+1

沒錯。你會有一個循環,像'while(bytesReceived

+0

非常感謝你,我已經有這個問題好幾天了,只是意識到是什麼導致了它。 – mitchellt

1

系統網絡緩衝區不是無限的,如果你不從windows套接字讀取它們到你的內部存儲器,它們將停止接收。

在這種情況下,你可能想爲您的數據創建一個記憶存儲:

byte[] data = new byte[dataLength]; 

並保持數據推入陣列,直到它是所有讀了。