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);
}
}