Skip to content

Commit 65635d7

Browse files
committed
读取解压功能重构完成。
1 parent 94e1c14 commit 65635d7

File tree

2 files changed

+31
-23
lines changed

2 files changed

+31
-23
lines changed

Quick.Protocol/QpChannel.cs

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using System.IO.Pipelines;
1616
using System.Buffers;
1717
using System.Collections.ObjectModel;
18+
using Nerdbank.Streams;
1819

1920
namespace Quick.Protocol
2021
{
@@ -894,7 +895,8 @@ private async Task ReadRecvPipeAsync(PipeReader recvReader, CancellationToken to
894895
Pipe decryptPipe = null;
895896
byte[] decryptBuffer1 = null;
896897
byte[] decryptBuffer2 = null;
897-
//Pipe decompressPipe = null;
898+
//解压相关变量
899+
Pipe decompressPipe = null;
898900
try
899901
{
900902
while (!token.IsCancellationRequested)
@@ -918,9 +920,10 @@ private async Task ReadRecvPipeAsync(PipeReader recvReader, CancellationToken to
918920
//如果设置了压缩或者加密
919921
if (options.InternalCompress || options.InternalEncrypt)
920922
{
921-
//如果设置了加密,则先解密
923+
//如果设置了加密
922924
if (options.InternalEncrypt)
923925
{
926+
//准备管道
924927
if (decryptPipe == null)
925928
{
926929
decryptPipe = new Pipe();
@@ -960,30 +963,35 @@ private async Task ReadRecvPipeAsync(PipeReader recvReader, CancellationToken to
960963
currentReader = decryptPipe.Reader;
961964
}
962965

963-
/*
964-
//如果设置了压缩,则先解压
966+
//如果设置了压缩
965967
if (options.InternalCompress)
966968
{
967-
var retBuffer = getFreeBuffer(currentPackageBuffer.Array, recvBuffer, recvBuffer2);
968-
var count = 0;
969-
using (var readMs = new MemoryStream(currentPackageBuffer.Array, PACKAGE_TOTAL_LENGTH_LENGTH + currentPackageBuffer.Offset, currentPackageBuffer.Count - PACKAGE_TOTAL_LENGTH_LENGTH, false))
970-
using (var writeMs = new MemoryStream(retBuffer, 0, retBuffer.Length))
971-
{
972-
using (var gzStream = new GZipStream(readMs, CompressionMode.Decompress, true))
973-
gzStream.CopyTo(writeMs);
974-
count = Convert.ToInt32(writeMs.Position);
969+
//准备管道
970+
if (decompressPipe == null)
971+
decompressPipe = new Pipe();
972+
973+
//写入包头
974+
decompressPipe.Writer.GetMemory(PACKAGE_TOTAL_LENGTH_LENGTH);
975+
decompressPipe.Writer.Advance(PACKAGE_TOTAL_LENGTH_LENGTH);
976+
packageTotalLength = PACKAGE_TOTAL_LENGTH_LENGTH;
977+
978+
//开始解压
979+
var compressedBuffer = packageBuffer.Slice(PACKAGE_TOTAL_LENGTH_LENGTH);
980+
using (var readMs = compressedBuffer.AsStream())
981+
using (var gzStream = new GZipStream(readMs, CompressionMode.Decompress, true))
982+
{
983+
var count = await gzStream.ReadAsync(decompressPipe.Writer.GetMemory(minimumBufferSize),token).ConfigureAwait(false);
984+
decompressPipe.Writer.Advance(count);
985+
packageTotalLength += count;
975986
}
976-
var currentBuffer = getFreeBuffer(retBuffer, recvBuffer, recvBuffer2);
977-
packageTotalLength = PACKAGE_TOTAL_LENGTH_LENGTH + count;
978-
writePackageTotalLengthToBuffer(currentBuffer, 0, packageTotalLength);
979-
Array.Copy(retBuffer, 0, currentBuffer, PACKAGE_TOTAL_LENGTH_LENGTH, count);
980-
currentPackageBuffer = new ArraySegment<byte>(currentBuffer, 0, packageTotalLength);
981-
}
982-
*/
983-
}
984-
else
985-
{
987+
await decompressPipe.Writer.FlushAsync().ConfigureAwait(false);
988+
//解压完成,释放缓存
989+
currentReader.AdvanceTo(packageBuffer.End);
986990

991+
ret = await decompressPipe.Reader.ReadAtLeastAsync(packageTotalLength, token).ConfigureAwait(false);
992+
packageBuffer = ret.Buffer;
993+
currentReader = decompressPipe.Reader;
994+
}
987995
}
988996

989997
//包类型

Quick.Protocol/Quick.Protocol.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
</ItemGroup>
2424

2525
<ItemGroup>
26-
<PackageReference Include="System.IO.Pipelines" Version="8.0.0" />
26+
<PackageReference Include="Nerdbank.Streams" Version="2.11.79" />
2727
</ItemGroup>
2828

2929
</Project>

0 commit comments

Comments
 (0)