字符串压缩/解压缩要通过网络发送的数据

我在C#中寻找一个字符串压缩方法,在将其写入网络套接字之前,我可以在数据字符串上运行它? 我对任何类型的压缩都相当新,因此我在这里寻找一些建议/指导。

为什么?

这在运行在服务器上的应用程序中是必需的,该服务器不断地将消息发送到我们的另一个服务器,但是托管应用程序的服务器按照使用的数据计费,这是相当昂贵的。 移动主机不是一种选择。

所以我需要一个算法/库,它可以通过文件(cpu wise)压缩我们发送的sting消息。 我愿意牺牲一些CPU使用来减少网络上的数据。

我不确定会有什么类型的压缩比,我认为这取决于您发送的字符串消息的类型及其长度。

我正在寻找相当短的字符串,平均从100个字符到256个字符。 奇怪的是长约900个字符。

示例字符串:

žŸKO9404ŸMR4ŸTT8DB3CŸTM08:50:26.253ŸDIVFSV09

这是一个较长的例子:

žŸAC15019ŸCI1602ŸSC7ŸZN001ŸPN01ŸFT7F55ŸCLSGKNetworkŸTP1ŸMR0ŸTT9733EŸIDGPAM01;GPAM02;GPAM03;GPAM05;GPAM04;GPAM06;GPAM07;GPAM08;GPAM09;GPAM10;GPAM02;GPAM03;GPAM04;GPAM05;GPAM06;GPAM07;GPAM08;GPAM09;GPAM10;GPAM01ŸTM09:01:08.858;09:01:09.066;09:01:09.043;09:01:09.044;09:01:09.066;09:01:09.066;09:01:09.065;09:01:09.068;09:01:09.067;09:01:09.067;09:01:50.395;09:01:50.386;09:01:50.386;09:01:50.386;09:01:50.396;09:01:50.384;09:01:50.385;09:01:50.386;09:01:50.386;09:01:50.384ŸTG584C;584C;584C;584C;584C;584C;584C;584C;584C;584C;589F;589F;589F;589F;589F;589F;589F;589F;589F;589F

所以我正在寻找一种解决方案,我可以在发送服务器上压缩,然后在接收服务器上解压缩。

什么是我最好的解决方案?

  • LZO压缩:有关更多信息: http : //www.oberhumer.com/opensource/lzo/
  • GZip压缩:有关更多信息: http : //msdn.microsoft.com/tr-tr/library/system.io.compression.gzipstream%28v=vs.110%29.aspx
  • 快速LZ压缩:有关更多信息,请访问: http : //www.quicklz.com/index.php

Gzip压缩样本:

  System.IO.MemoryStream ms = new System.IO.MemoryStream(); System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress); //Compress sw.Write ... sw.Close(); 

用于解压缩的Gzip样本:

  System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray); System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress); //Decompress int rByte = sr.Read ... sr.Close(); 

由于你的字符串长度平均为900,为什么你需要压缩它,因为普通网络的最低MTU大约是1474(以太网和ipV4)? 知道你的一半字节是UTF-8 1字节编码。

即:如果您通过网络发送100-250 bytes ,则与发送1474 bytes成本相同。

您可以在同一名称空间中查看System.IO.Compression.GZipStream类或其“兄弟”DeflateStream。

鉴于您控制解决方案的两端。 也许你应该考虑使用像Protobuf之类的东西构建的二进制协议,而不是使用Text并尝试压缩它。

如果您可以在一个块中发送较少的数据,但是通过网络将更多这些块作为一个操作发送,则可以降低传输成本。

ABC – 第一次发送(延迟3秒)DEF – 第二次发送

发送ABCDEF 1发送,但延迟6秒。