我正在使用C#.Net和System.Net.Sockets命名空间中的Socket类。我正在使用异步接收方法。我知道这可以通过Web服务更轻松地完成;这个问题是出于好奇而非实际需要。
我的问题是:假设客户端正在发送一些未知长度的二进制序列化对象。在我的服务器上使用套接字,我如何知道已收到整个对象并且已准备好进行反序列化?我已经考虑用对象的长度以字节为单位预先添加对象,但在.Net世界中这似乎是不必要的。如果对象大于缓冲区会发生什么?我怎么知道,“嘿,因为对象太大了,所以要调整缓冲区的大小”?
答案 0 :(得分:11)
你要么需要协议自我终止(就像XML一样,实际上 - 你知道当你关闭根元素时完成XML文档的接收时)或< / em>你需要对数据进行长度前缀,或你需要另一端在完成后关闭流。
在自终止协议的情况下,您需要有足够的挂钩,以便读取代码可以告诉它何时完成。使用二进制序列化,您可能没有足够的钩子。长度前缀是目前最简单的解决方案。
答案 1 :(得分:4)
如果您使用纯插座,则需要知道长度。否则,缓冲区的大小是不相关的,因为即使你有一个整个数据大小的缓冲区,它仍然可能无法全部读入它 - 检查Stream.Read方法,它返回实际读取的nr的咬合,所以你需要循环,直到收到所有数据。
答案 2 :(得分:0)
是的,在你删除所有字节之前,你不会反序列化。