【问题标题】:Reliably and definitively detect end of socket stream可靠且明确地检测套接字流的结束
【发布时间】:2015-01-12 11:45:47
【问题描述】:

我正在修复使用套接字通过网络传输一系列字节。我正在使用二进制格式化程序来序列化我希望发送的对象,然后在机器之间传送它们并在到达目的地时反序列化它们。之前有人问过这个问题“如何检测字节流的结束”,但我的困境有点不同。我希望能够通过该网络发送多种类型的对象。我会简单地使用标记或商定的字节序列来传达消息的结尾,但是因为我不知道二进制格式化程序会产生什么,所以我不知道我可以使用什么字符序列是唯一的。如果我决定使用序列 255、128、0、255 来表示一个对象流的结束,我如何确保该序列不会出现在 binaryformatter 输出中?我还能做些什么来表示一个对象的结束和另一个对象的开始?

感谢您的帮助。

【问题讨论】:

  • 如果您无法控制消息的内容,则需要消息框架。
  • 我知道,我在问我可以用什么来构建我可以保证是独一无二的内容。

标签: c# sockets serialization


【解决方案1】:

这通常在消息的开头使用长度指示来完成。

假设您将数据(可以是图像、文本等)压缩为字节数组。你取这个字节数组的长度,比如说 500,然后把这个数字保存在你的流的开头。这个长度数字的字节长度必须始终相同,所以假设数字 500 是 32 个字节,它看起来像这样)

00000000 00000000 00000001 11110100 and after this the 500 bytes of your actualy message comes

通过这种方式,您始终可以知道从读取前 32 个字节到您的消息需要多长时间,并且您可以知道消息何时结束。

【讨论】:

  • 现在我看到了,这实际上是非常有说服力和显而易见的。非常感谢你把它说得这么清楚。 :)
  • 是的,60 年代的人很聪明 :)
猜你喜欢
  • 2011-11-27
  • 2016-01-22
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2012-06-22
相关资源
最近更新 更多