2009-01-26 77 views
11

我使用C#.Net和System.Net.Sockets命名空間中的Socket類。我正在使用異步接收方法。我知道這可以通過諸如Web服務之類的東西更容易地完成;這個問題是出於我的好奇心而不是實際的需要。c#流接收到所有數據?

我的問題是:假設客戶端發送一些未知長度的二進制序列化對象。在我的服務器上使用套接字,我如何知道整個對象已被接收,並且已準備好進行反序列化?我已經考慮過將對象的長度以字節爲單位,但在.Net世界中這似乎是不必要的。如果對象大於緩衝區會發生什麼?我怎麼知道,'嘿,因爲物體太大而必須重新調整緩衝區'?

回答

11

要麼需要的協議是自終止(如XML是有效的 - 你知道,當你完成接收XML文檔當它關閉根元素)需要長度前綴數據您需要另一端在完成時關閉流。

在自終止協議的情況下,您需要有足夠的鉤子以便讀取代碼可以告訴它何時完成。使用二進制序列化你可能沒有足夠的鉤子。長度前綴是迄今爲止最簡單的解決方案。

4

如果您使用純套接字,您需要知道長度。否則,緩衝區的大小是不相關的,因爲即使你有一個整個數據大小的緩衝區,它仍然可能不會全部讀入它 - 檢查Stream.Read方法,它返回實際讀取的叮的nr,所以你需要循環直到收到所有數據。

0

是的,你不會反序列化,直到你所有的字節rxed。

相關問題