From 4ce731017117ed19066fbb8b5e5f5e8bfc27eaef Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 20 Jun 2025 09:48:57 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E6=AC=A1=E7=B2=98=E5=8C=85=E5=A4=84=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FixLengthDataPackageHandler.cs | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs b/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs index 3efbe4dee7b..adb28a8d304 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs @@ -28,28 +28,40 @@ public override async Task ReceiveAsync(Memory data) // 处理上次粘包数据 data = ConcatBuffer(data); - // 拷贝数据 - var len = length - _receivedLength; - var segment = data.Length > len ? data[..len] : data; - segment.CopyTo(_data[_receivedLength..]); - - if (data.Length > len) + while (data.Length > 0) { - SlicePackage(data, data.Length - len); - } + // 拷贝数据 + var len = length - _receivedLength; + var segment = data.Length > len ? data[..len] : data; + segment.CopyTo(_data[_receivedLength..]); - // 更新已接收长度 - _receivedLength += segment.Length; + // 更新已接收长度 + _receivedLength += segment.Length; - // 如果已接收长度等于总长度则触发回调 - if (_receivedLength == length) - { - // 重置已接收长度 - _receivedLength = 0; - if (ReceivedCallBack != null) + // 如果已接收长度等于总长度则触发回调 + if (_receivedLength == length) + { + // 重置已接收长度 + _receivedLength = 0; + if (ReceivedCallBack != null) + { + await ReceivedCallBack(_data); + } + } + + // 检查剩余长度是否大于总长度 + if (data.Length >= segment.Length + length) + { + data = data[segment.Length..]; + continue; + } + + // 缓存剩余数据 + if (data.Length > len) { - await ReceivedCallBack(_data); + SlicePackage(data, data.Length - len); } + break; } } } From 60032871935efe6cd2f9beedac4072d11760a329 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 20 Jun 2025 09:49:03 +0800 Subject: [PATCH 2/4] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitTest/Services/TcpSocketFactoryTest.cs | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/test/UnitTest/Services/TcpSocketFactoryTest.cs b/test/UnitTest/Services/TcpSocketFactoryTest.cs index 3e610bb8599..22b3d0f2e23 100644 --- a/test/UnitTest/Services/TcpSocketFactoryTest.cs +++ b/test/UnitTest/Services/TcpSocketFactoryTest.cs @@ -249,14 +249,22 @@ public async Task FixLengthDataPackageHandler_Sticky() // 验证接收到的数据 Assert.Equal(receivedBuffer.ToArray(), [1, 2, 3, 4, 5, 3, 4]); - - // 等待第二次数据 receivedBuffer = Memory.Empty; tcs = new TaskCompletionSource(); + + // 等待第二次数据 await tcs.Task; // 验证第二次收到的数据 - Assert.Equal(receivedBuffer.ToArray(), [1, 2, 3, 4, 5, 6, 7]); + Assert.Equal(receivedBuffer.ToArray(), [2, 2, 3, 4, 5, 6, 7]); + tcs = new TaskCompletionSource(); + await tcs.Task; + + // 等待第二次数据 + await tcs.Task; + + // 验证第三次收到的数据 + Assert.Equal(receivedBuffer.ToArray(), [3, 2, 3, 4, 5, 6, 7]); // 关闭连接 client.Close(); @@ -398,16 +406,16 @@ private static async Task MockStickyPackageAsync(TcpClient client) await stream.WriteAsync(block, CancellationToken.None); // 模拟延时 - await Task.Delay(50); + await Task.Delay(10); // 模拟拆包发送第二段数据 - await stream.WriteAsync(new byte[] { 0x3, 0x4, 0x1, 0x2 }, CancellationToken.None); + await stream.WriteAsync(new byte[] { 0x3, 0x4, 0x2, 0x2 }, CancellationToken.None); // 模拟延时 - await Task.Delay(50); + await Task.Delay(10); // 模拟粘包发送后续数据 - await stream.WriteAsync(new byte[] { 0x3, 0x4, 0x5, 0x6, 0x7 }, CancellationToken.None); + await stream.WriteAsync(new byte[] { 0x3, 0x4, 0x5, 0x6, 0x7, 0x3, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x1 }, CancellationToken.None); } } From 44f04ded6958237b7cf148dca5f0ceb5660da197 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 20 Jun 2025 10:06:13 +0800 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=E4=BB=A3=E7=A0=81=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E6=8F=90=E9=AB=98=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataPackage/FixLengthDataPackageHandler.cs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs b/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs index adb28a8d304..d4e7a0a3e92 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs @@ -35,6 +35,9 @@ public override async Task ReceiveAsync(Memory data) var segment = data.Length > len ? data[..len] : data; segment.CopyTo(_data[_receivedLength..]); + // 更新数据 + data = data[segment.Length..]; + // 更新已接收长度 _receivedLength += segment.Length; @@ -47,19 +50,13 @@ public override async Task ReceiveAsync(Memory data) { await ReceivedCallBack(_data); } - } - - // 检查剩余长度是否大于总长度 - if (data.Length >= segment.Length + length) - { - data = data[segment.Length..]; continue; } // 缓存剩余数据 - if (data.Length > len) + if (data.Length > 0) { - SlicePackage(data, data.Length - len); + SlicePackage(data, data.Length); } break; } From 17abdb7bef7454102f01510ad79f3c385319b7ef Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 20 Jun 2025 10:16:12 +0800 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=E7=B2=BE=E7=AE=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=8F=90=E9=AB=98=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataPackage/FixLengthDataPackageHandler.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs b/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs index d4e7a0a3e92..798c95d0815 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs @@ -25,9 +25,6 @@ public class FixLengthDataPackageHandler(int length) : DataPackageHandlerBase /// public override async Task ReceiveAsync(Memory data) { - // 处理上次粘包数据 - data = ConcatBuffer(data); - while (data.Length > 0) { // 拷贝数据 @@ -52,13 +49,6 @@ public override async Task ReceiveAsync(Memory data) } continue; } - - // 缓存剩余数据 - if (data.Length > 0) - { - SlicePackage(data, data.Length); - } - break; } } }