通过套接字发送序列化对象

时间:2009-10-08 07:30:49

标签: c# sockets object

将消息格式化为服务器的最佳方法是什么,此刻我正在使用二进制格式化器对一个对象进行serilising,然后将其发送到服务器。

在服务器端,它以异步方式监听,然后当收到的缓冲区大小不是100%时,它假定传输已完成。

这是工作和时刻,我可以在另一端反序列化对象,我只关心如果我开始发送异步这个方法将失败,消息可能会模糊。

我知道我需要以某种方式标记消息,以便说消息一是结束,另一位属于消息2,但我不确定这样做的正确方法。

有人能指出我正确的方向并且可能会给我一些例子吗?

由于

3 个答案:

答案 0 :(得分:2)

您始终可以将其序列化为内存流,查看它有多大,将长度作为4字节二进制数发送,然后发送流的内容。

另一方面,您可以坐下等待4个字节,将它们组合成一个整数然后等待该字节数。

当你的read函数返回(使它们成为阻塞读取)时,你知道你将整个对象放入缓冲区,所以你只需要反序列化它并将其转换为你的公共接口类型。

编辑:这是您具体问题的答案。这就是说,使用比纯tcp更高级别的库会更好。

答案 1 :(得分:1)

  1. 如果您的对象具有固定长度,您可以在另一端接收指定数量的字节,然后创建您的对象。
  2. 否则,您可以在对象之间发送分隔符(对象中未使用的符号或符号序列),并逐字节地读取接收的数据,直到看到分隔符。

答案 2 :(得分:0)

您可能需要查看协议缓冲区(http://code.google.com/p/protobuf),一种(实现语言无关的)数据交换格式/框架。它至少存在两个.NET实现(参见http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns)。