diff --git a/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs b/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs index 3efbe4dee7b..798c95d0815 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/DataPackage/FixLengthDataPackageHandler.cs @@ -25,30 +25,29 @@ public class FixLengthDataPackageHandler(int length) : DataPackageHandlerBase /// 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; + // 更新数据 + data = data[segment.Length..]; - // 如果已接收长度等于总长度则触发回调 - if (_receivedLength == length) - { - // 重置已接收长度 - _receivedLength = 0; - if (ReceivedCallBack != null) + // 更新已接收长度 + _receivedLength += segment.Length; + + // 如果已接收长度等于总长度则触发回调 + if (_receivedLength == length) { - await ReceivedCallBack(_data); + // 重置已接收长度 + _receivedLength = 0; + if (ReceivedCallBack != null) + { + await ReceivedCallBack(_data); + } + continue; } } } 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); } }