繁体   English   中英

C# - 通过网络序列化数据包

[英]C# - Serializing Packets Over a Network

我正在开发一个发送大量数据包的网络应用程序。 目前,我的序列化方法只是一个hack,它接受一个对象列表并将它们转换为由管道字符“|”分隔的字符串。 并将其刷新到网络流中(或者只是通过UDP发送出去)。

我正在寻找一种更清洁的C#解决方案,同时最大程度地减少数据包大小(因此不进行大量XML序列化)。

我对BinaryFormatter is SLOW体验BinaryFormatter is SLOW 我也在考虑通过将数据包编码为base64字符串来压缩我的数据包,并在客户端对它们进行解码。 我想看看这将如何影响我的应用程序的性能。

另外,另一个快速问题:

我的设置创建2个套接字(一个TCP and UDP ),客户端分别连接到这两个套接字。 根据需要刷新数据(TCP表示重要的东西,UDP表示不重要的东西)。 这是我第一次同时使用TCP / UDP并且想知道

如果有一个更统一的方法,尽管看起来并非如此。

一如既往地感谢您的大力支持。

我会使用类似于谷歌的协议缓冲区的二进制协议。 使用John Skeet的protobuf-csharp-port,可以分别使用IMessage和IBuilder上的WriteDelimitedTo和MergeDelimitedFrom方法。 这些将在消息前面加上字节数,以便它们可以在另一端消耗。 定义消息非常简单:

message MyMessage {
    required int32 number = 1;
}

然后用ProtoGen.exe构建C#类,然后去城里。 protobuffers(特别是protobuf-csharp-port)的一大好处是不是每个端点都需要同时升级。 以前的版本可以添加和使用新字段而不会出现错误。 这个版本的独立性可能非常强大,但是如果你没有计划它也会咬你;)

您可以考虑使用ProtoBuf进行血清化

我个人使用了以下系统:有抽象的Packet类,所有的数据包都来自。 Packet类定义了两个虚拟方法:

void SerializeToStream(BinaryWriter serializationStream)
void BuildFromStream(BinaryReader serializationStream)

这种手动序列化可以创建小型数据包。 在发送到套接字之前,数据包的长度为前缀,并且前缀为唯一的数据包类型ID号。 接收端然后可以使用Activator.CreateInstance来构建适当的数据包并调用BuildFromStream来重建数据包。

示例数据包:

class LocationUpdatePacket : Packet
{
   public int X;
   public int Y;
   public int Z;

   public override void SerializeToStream(BinaryWriter serializationStream)
   {
         serializationStream.Write(X);
         serializationStream.Write(Y);
         serializationStream.Write(Z);
   }
   public override void BuildFromStream(BinaryReader serializationStream)
   {
         X = serializationStream.ReadInt32();
         Y = serializationStream.ReadInt32();
         Z = serializationStream.ReadInt32();
   }
}

我正在开发一个发送大量数据包的联网应用程序

查看一个开源网络通信库networkComms.net可能会为您节省大量时间。 它集成为protobuf的序列化,其中的一个例子是在这里 ,线408。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM