簡體   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