2009-01-26 44 views
11

我使用C#.Net和System.Net.Sockets命名空间中的Socket类。我正在使用异步接收方法。我知道这可以通过诸如Web服务之类的东西更容易地完成;这个问题是出于我的好奇心而不是实际的需要。c#流接收到所有数据?

我的问题是:假设客户端发送一些未知长度的二进制序列化对象。在我的服务器上使用套接字,我如何知道整个对象已被接收,并且已准备好进行反序列化?我已经考虑过将对象的长度以字节为单位,但在.Net世界中这似乎是不必要的。如果对象大于缓冲区会发生什么?我怎么知道,'嘿,因为物体太大而必须重新调整缓冲区'?

回答

11

要么需要的协议是自终止(如XML是有效的 - 你知道,当你完成接收XML文档当它关闭根元素)需要长度前缀数据您需要另一端在完成时关闭流。

在自终止协议的情况下,您需要有足够的钩子以便读取代码可以告诉它何时完成。使用二进制序列化你可能没有足够的钩子。长度前缀是迄今为止最简单的解决方案。

4

如果您使用纯套接字,您需要知道长度。否则,缓冲区的大小是不相关的,因为即使你有一个整个数据大小的缓冲区,它仍然可能不会全部读入它 - 检查Stream.Read方法,它返回实际读取的叮的nr,所以你需要循环直到收到所有数据。

0

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

相关问题