C# 流式套接字,如何分离消息?

2023-11-30

标题有点长,但无论如何...

我一直在查看这些示例,特别是关于向字节流写入和读取消息大小的部分
http://doc.trolltech.com/4.4/network-fortuneclient-client-cpp.html
http://doc.trolltech.com/4.4/network-fortuneserver-server-cpp.html

但我似乎无法在 C# 中弄清楚。

StreamWriter writer = new StreamWriter(tcpClient.GetStream());
writer.Write(data.Length + data);

这根本就不太好用。有人可以给我一个正确的方向吗?


一般来说,您会先发送长度。两端应该就长度达成一致 - 例如,您可能很乐意使用固定的 4 字节长度前缀作为二进制:

  byte[] data = ...
  int len = data.Length;
  byte[] prefix = Bitconverter.GetBytes(len);
  stream.Write(prefix, 0, prefix.Length); // fixed 4 bytes
  stream.Write(data, 0, data.Length);

显然,调用者需要执行相同的操作 - 即读取前 4 个字节以获取长度。读取时,接收方应注意不要读取过多的数据。一种方法是使用限制流 - 例如,这个班可用于获取不会读取太多内容的 Stream。

如果您不希望总是发送 4 个字节的开销,那么可以使用一些更有趣的编码 - 例如,使用 msb 作为连续块。

有关信息,protobuf网络是一个围绕 Google 的“协议缓冲区”基于消息的格式设计的二进制序列化器。它为您处理许多细节,如果您不想花费大量时间编写序列化代码,它可能会感兴趣。 QuickStart 项目中有套接字的示例,例如这里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 流式套接字,如何分离消息? 的相关文章

随机推荐