From 3bf37c5d34f01134b300c3c64653c9649568ecf6 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 08:37:00 +0800 Subject: [PATCH 01/16] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=20License=20?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 2 +- .../BootstrapBlazor.TcpSocket.csproj | 2 +- .../DefaultTcpSocketClient.cs | 2 +- .../DefaultTcpSocketClientProvider.cs | 2 +- .../DefaultTcpSocketFactory.cs | 2 +- .../Extensions/ITcpSocketClientExtensions.cs | 37 +++++++++++++++++-- .../Extensions/TcpSocketExtensions.cs | 2 +- .../Extensions/TcpSocketUtility.cs | 2 +- .../ITcpSocketClient.cs | 2 +- .../ITcpSocketClientProvider.cs | 2 +- .../ITcpSocketFactory.cs | 2 +- .../TcpSocketClientOptions.cs | 2 +- 12 files changed, 44 insertions(+), 15 deletions(-) diff --git a/.editorconfig b/.editorconfig index cfb50819..61033d26 100644 --- a/.editorconfig +++ b/.editorconfig @@ -216,7 +216,7 @@ csharp_preserve_single_line_blocks = true visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion [*.cs] # Add file header -file_header_template = Copyright (c) Argo Zhang (argo@163.com). All rights reserved.\nLicensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\nWebsite: https://www.blazor.zone or https://argozhang.github.io/ +file_header_template = Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved.\nLicensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\nWebsite: https://www.blazor.zone or https://argozhang.github.io/ csharp_style_namespace_declarations = file_scoped:suggestion csharp_style_expression_bodied_local_functions = true:silent csharp_using_directive_placement = outside_namespace:silent diff --git a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj index 33f5d97a..72289d32 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj +++ b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj @@ -1,7 +1,7 @@  - 9.0.0 + 9.0.1-beta01 diff --git a/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketClient.cs b/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketClient.cs index 30e0830c..72f7c237 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketClient.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ diff --git a/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketClientProvider.cs b/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketClientProvider.cs index 5d31cf4d..8fa3e886 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketClientProvider.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketClientProvider.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ diff --git a/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketFactory.cs b/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketFactory.cs index 627a579b..7fb40486 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketFactory.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/DefaultTcpSocketFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index f02ecb34..aac27985 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -1,7 +1,6 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the Apache 2.0 License -// See the LICENSE file in the project root for more information. -// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Website: https://www.blazor.zone or https://argozhang.github.io/ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -78,6 +77,21 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPack adapter.ReceivedCallBack = buffer => callback(buffer); } + /// + /// 通过指定 数据处理实例,设置数据适配器并配置回调方法 + /// + /// 实例 + /// 数据处理实例 + /// 回调方法 + public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, Func, ValueTask> callback) + { + var adapter = new DataPackageAdapter + { + DataPackageHandler = handler + }; + client.SetDataPackageAdapter(adapter, callback); + } + /// /// Configures the specified to use a data package adapter and a callback function /// for processing received data. @@ -163,6 +177,21 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, } } + /// + /// 通过指定 数据处理实例,设置数据适配器并配置回调方法 + /// + /// 实例 + /// 数据处理实例 + /// 回调方法 + public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, Func callback) + { + var adapter = new DataPackageAdapter + { + DataPackageHandler = handler + }; + client.SetDataPackageAdapter(adapter, callback); + } + private static void SetDataAdapterCallback(this IDataPackageAdapter adapter, IDataConverter converter, Func callback) { adapter.ReceivedCallBack = async buffer => diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketExtensions.cs index 3371ccb4..e3d2cbf9 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketUtility.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketUtility.cs index 1118828a..9b91e7a9 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketUtility.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketUtility.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ diff --git a/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketClient.cs b/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketClient.cs index dcf58028..3e491134 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketClient.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ diff --git a/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketClientProvider.cs b/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketClientProvider.cs index 14647fa6..00b82018 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketClientProvider.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketClientProvider.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ diff --git a/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketFactory.cs b/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketFactory.cs index b791809c..c97065a3 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketFactory.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/ITcpSocketFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ diff --git a/src/extensions/BootstrapBlazor.TcpSocket/TcpSocketClientOptions.cs b/src/extensions/BootstrapBlazor.TcpSocket/TcpSocketClientOptions.cs index 40a43441..88907b1e 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/TcpSocketClientOptions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/TcpSocketClientOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ From 9f258858fcc141185e45d3ad1a9a03d8bc246cfa Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 08:37:14 +0800 Subject: [PATCH 02/16] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BootstrapBlazor.Extensions.sln | 1 + 1 file changed, 1 insertion(+) diff --git a/BootstrapBlazor.Extensions.sln b/BootstrapBlazor.Extensions.sln index 7dbcbca8..c5d4f29b 100644 --- a/BootstrapBlazor.Extensions.sln +++ b/BootstrapBlazor.Extensions.sln @@ -647,6 +647,7 @@ Global {01007B10-7C3C-4136-83FF-981CA39AD3D4} = {7B29E81D-92DE-46C8-8EDC-1B48C8F12BC2} {835C8BA9-A9CC-4EA0-9002-34A20F8B2E86} = {B6A98ADE-D26A-4D0B-8978-AB7AC915F5AE} {30C57119-C564-401C-AE3A-6203E2733E1A} = {FF1089BE-C704-4374-B629-C57C08E1798F} + {98054DCC-A9AB-CB11-798F-424112EC8639} = {7B29E81D-92DE-46C8-8EDC-1B48C8F12BC2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D5EB1960-6F30-4CE1-B375-EAE1F787D6FF} From 2077f6b4fabf34be8b6295351ac78dd4a0a265c7 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 10:24:48 +0800 Subject: [PATCH 03/16] =?UTF-8?q?chore:=20=E5=A2=9E=E5=8A=A0=20AddDataPack?= =?UTF-8?q?ageAdapter=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ITcpSocketClientExtensions.cs | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index aac27985..25f4fc8e 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -51,6 +51,56 @@ public static ValueTask ConnectAsync(this ITcpSocketClient client, string return client.ConnectAsync(endPoint, token); } + private readonly static Dictionary<(ITcpSocketClient Client, IDataPackageAdapter Adapter), List, ValueTask>>> _callbackCache = []; + + /// + /// 增加 数据适配器及其对应的回调方法 + /// + /// + /// + /// + public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func, ValueTask> callback) + { + if (_callbackCache.TryGetValue((client, adapter), out var list)) + { + list.Add(cb); + } + else + { + _callbackCache.Add((client, adapter), [cb]); + } + + client.ReceivedCallBack += cb; + + // 设置 DataPackageAdapter 的回调函数 + adapter.ReceivedCallBack = buffer => callback(buffer); + + async ValueTask cb(ReadOnlyMemory buffer) + { + // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 + await adapter.HandlerAsync(buffer); + } + } + + /// + /// 移除 数据适配器及其对应的回调方法 + /// + /// + /// + /// + public static void RemoveDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func, ValueTask> callback) + { + if (_callbackCache.TryGetValue((client, adapter), out var list)) + { + var cbs = list.Where(i => i == callback).ToList(); + foreach (var cb in cbs) + { + client.ReceivedCallBack -= cb; + list.Remove(cb); + } + } + } + /// /// Configures the specified to use the provided /// for processing received data and sets a callback to handle processed data. From 2629fb2dc9b6eed87931d72f7612793a37a150bb Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 10:25:02 +0800 Subject: [PATCH 04/16] chore: bump version 9.0.1-beta02 --- .../BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj index 72289d32..9578a9ec 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj +++ b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj @@ -1,7 +1,7 @@  - 9.0.1-beta01 + 9.0.1-beta02 From e15229f32dff8026eecc0ea28d209eb483a97182 Mon Sep 17 00:00:00 2001 From: argo-vip Date: Tue, 26 Aug 2025 11:34:08 +0800 Subject: [PATCH 05/16] =?UTF-8?q?refactor:=20=E7=B2=BE=E7=AE=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataAdapter/DataPackageAdapter.cs | 11 ++++++----- .../DataAdapter/IDataPackageAdapter.cs | 8 ++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/extensions/BootstrapBlazor.Socket/DataAdapter/DataPackageAdapter.cs b/src/extensions/BootstrapBlazor.Socket/DataAdapter/DataPackageAdapter.cs index 315994c2..d31e7838 100644 --- a/src/extensions/BootstrapBlazor.Socket/DataAdapter/DataPackageAdapter.cs +++ b/src/extensions/BootstrapBlazor.Socket/DataAdapter/DataPackageAdapter.cs @@ -7,21 +7,22 @@ namespace BootstrapBlazor.DataAdapters; /// /// Provides a base implementation for adapting data packages between different systems or formats. /// +/// 实例 /// This abstract class serves as a foundation for implementing custom data package adapters. It defines /// common methods for sending, receiving, and handling data packages, as well as a property for accessing the /// associated data package handler. Derived classes should override the virtual methods to provide specific behavior /// for handling data packages. -public class DataPackageAdapter : IDataPackageAdapter +public class DataPackageAdapter(IDataPackageHandler DataPackageHandler) : IDataPackageAdapter { /// /// /// public Func, ValueTask>? ReceivedCallBack { get; set; } - /// - /// - /// - public IDataPackageHandler? DataPackageHandler { get; set; } + ///// + ///// + ///// + //public IDataPackageHandler DataPackageHandler => handler; /// /// diff --git a/src/extensions/BootstrapBlazor.Socket/DataAdapter/IDataPackageAdapter.cs b/src/extensions/BootstrapBlazor.Socket/DataAdapter/IDataPackageAdapter.cs index 5e5a0268..fe5edcab 100644 --- a/src/extensions/BootstrapBlazor.Socket/DataAdapter/IDataPackageAdapter.cs +++ b/src/extensions/BootstrapBlazor.Socket/DataAdapter/IDataPackageAdapter.cs @@ -20,10 +20,10 @@ public interface IDataPackageAdapter /// issues. Func, ValueTask>? ReceivedCallBack { get; set; } - /// - /// Gets the handler responsible for processing data packages. - /// - IDataPackageHandler? DataPackageHandler { get; } + ///// + ///// Gets the handler responsible for processing data packages. + ///// + //IDataPackageHandler? DataPackageHandler { get; } /// /// Asynchronously receives data from a source and processes it. From 511b080182c2d4e28bb168e3d87702b78fa10724 Mon Sep 17 00:00:00 2001 From: argo-vip Date: Tue, 26 Aug 2025 11:34:49 +0800 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=BC=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ITcpSocketClientExtensions.cs | 35 +++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index 25f4fc8e..8a0a4630 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -51,7 +51,7 @@ public static ValueTask ConnectAsync(this ITcpSocketClient client, string return client.ConnectAsync(endPoint, token); } - private readonly static Dictionary<(ITcpSocketClient Client, IDataPackageAdapter Adapter), List, ValueTask>>> _callbackCache = []; + private readonly static Dictionary, ValueTask> Callback)>> _callbackCache = []; /// /// 增加 数据适配器及其对应的回调方法 @@ -61,19 +61,19 @@ public static ValueTask ConnectAsync(this ITcpSocketClient client, string /// public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func, ValueTask> callback) { - if (_callbackCache.TryGetValue((client, adapter), out var list)) + if (_callbackCache.TryGetValue(client, out var list)) { - list.Add(cb); + list.Add((adapter, cb)); } else { - _callbackCache.Add((client, adapter), [cb]); + _callbackCache.Add(client, [(adapter, cb)]); } client.ReceivedCallBack += cb; // 设置 DataPackageAdapter 的回调函数 - adapter.ReceivedCallBack = buffer => callback(buffer); + adapter.ReceivedCallBack = callback; async ValueTask cb(ReadOnlyMemory buffer) { @@ -86,17 +86,16 @@ async ValueTask cb(ReadOnlyMemory buffer) /// 移除 数据适配器及其对应的回调方法 /// /// - /// /// - public static void RemoveDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func, ValueTask> callback) + public static void RemoveDataPackageAdapter(this ITcpSocketClient client, Func, ValueTask> callback) { - if (_callbackCache.TryGetValue((client, adapter), out var list)) + if (_callbackCache.TryGetValue(client, out var list)) { - var cbs = list.Where(i => i == callback).ToList(); - foreach (var cb in cbs) + var items = list.Where(i => i.Adapter.ReceivedCallBack == callback).ToList(); + foreach (var c in items) { - client.ReceivedCallBack -= cb; - list.Remove(cb); + client.ReceivedCallBack -= c.Callback; + list.Remove(c); } } } @@ -135,11 +134,7 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPack /// 回调方法 public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, Func, ValueTask> callback) { - var adapter = new DataPackageAdapter - { - DataPackageHandler = handler - }; - client.SetDataPackageAdapter(adapter, callback); + client.SetDataPackageAdapter(new DataPackageAdapter(handler), callback); } /// @@ -235,11 +230,7 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, /// 回调方法 public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, Func callback) { - var adapter = new DataPackageAdapter - { - DataPackageHandler = handler - }; - client.SetDataPackageAdapter(adapter, callback); + client.SetDataPackageAdapter(new DataPackageAdapter(handler), callback); } private static void SetDataAdapterCallback(this IDataPackageAdapter adapter, IDataConverter converter, Func callback) From cf1e4746efcfa69749361bb534ba372fe3edca34 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 11:57:42 +0800 Subject: [PATCH 07/16] refactor: bump version 9.0.1 --- .../BootstrapBlazor.Socket.csproj | 2 +- .../DataAdapter/DataPackageAdapter.cs | 14 +++----------- .../DataAdapter/IDataPackageAdapter.cs | 5 ----- 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/extensions/BootstrapBlazor.Socket/BootstrapBlazor.Socket.csproj b/src/extensions/BootstrapBlazor.Socket/BootstrapBlazor.Socket.csproj index 940fb5fe..cf6fc6cf 100644 --- a/src/extensions/BootstrapBlazor.Socket/BootstrapBlazor.Socket.csproj +++ b/src/extensions/BootstrapBlazor.Socket/BootstrapBlazor.Socket.csproj @@ -1,7 +1,7 @@  - 9.0.0 + 9.0.1 diff --git a/src/extensions/BootstrapBlazor.Socket/DataAdapter/DataPackageAdapter.cs b/src/extensions/BootstrapBlazor.Socket/DataAdapter/DataPackageAdapter.cs index d31e7838..de35e3cb 100644 --- a/src/extensions/BootstrapBlazor.Socket/DataAdapter/DataPackageAdapter.cs +++ b/src/extensions/BootstrapBlazor.Socket/DataAdapter/DataPackageAdapter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ @@ -12,18 +12,13 @@ namespace BootstrapBlazor.DataAdapters; /// common methods for sending, receiving, and handling data packages, as well as a property for accessing the /// associated data package handler. Derived classes should override the virtual methods to provide specific behavior /// for handling data packages. -public class DataPackageAdapter(IDataPackageHandler DataPackageHandler) : IDataPackageAdapter +public class DataPackageAdapter(IDataPackageHandler? DataPackageHandler = null) : IDataPackageAdapter { /// /// /// public Func, ValueTask>? ReceivedCallBack { get; set; } - ///// - ///// - ///// - //public IDataPackageHandler DataPackageHandler => handler; - /// /// /// @@ -34,10 +29,7 @@ public virtual async ValueTask HandlerAsync(ReadOnlyMemory data, Cancellat { if (DataPackageHandler != null) { - if (DataPackageHandler.ReceivedCallBack == null) - { - DataPackageHandler.ReceivedCallBack = OnHandlerReceivedCallBack; - } + DataPackageHandler.ReceivedCallBack ??= OnHandlerReceivedCallBack; // 如果存在数据处理器则调用其处理方法 await DataPackageHandler.HandlerAsync(data, token); diff --git a/src/extensions/BootstrapBlazor.Socket/DataAdapter/IDataPackageAdapter.cs b/src/extensions/BootstrapBlazor.Socket/DataAdapter/IDataPackageAdapter.cs index fe5edcab..1dc43b1a 100644 --- a/src/extensions/BootstrapBlazor.Socket/DataAdapter/IDataPackageAdapter.cs +++ b/src/extensions/BootstrapBlazor.Socket/DataAdapter/IDataPackageAdapter.cs @@ -20,11 +20,6 @@ public interface IDataPackageAdapter /// issues. Func, ValueTask>? ReceivedCallBack { get; set; } - ///// - ///// Gets the handler responsible for processing data packages. - ///// - //IDataPackageHandler? DataPackageHandler { get; } - /// /// Asynchronously receives data from a source and processes it. /// From f8907758b12fd74c03698fe42f1d6d6ec975c46f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 12:18:00 +0800 Subject: [PATCH 08/16] =?UTF-8?q?doc:=20=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapBlazor.TcpSocket/Extensions/TcpSocketUtility.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketUtility.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketUtility.cs index 9b91e7a9..3c563331 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketUtility.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/TcpSocketUtility.cs @@ -48,7 +48,6 @@ public static IPAddress ConvertToIPAddress(string ipString) } [ExcludeFromCodeCoverage] - [UnsupportedOSPlatform("browser")] private static IPAddress IPAddressByHostName => Dns.GetHostAddresses(Dns.GetHostName(), AddressFamily.InterNetwork).FirstOrDefault() ?? IPAddress.Any; From a0c8444ab1185b2edcbb26b148b0819a349b4cd8 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 12:18:13 +0800 Subject: [PATCH 09/16] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ITcpSocketClientExtensions.cs | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index 8a0a4630..816ea027 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -51,7 +51,7 @@ public static ValueTask ConnectAsync(this ITcpSocketClient client, string return client.ConnectAsync(endPoint, token); } - private readonly static Dictionary, ValueTask> Callback)>> _callbackCache = []; + private static readonly Dictionary, ValueTask> Callback)>> _cache = []; /// /// 增加 数据适配器及其对应的回调方法 @@ -61,13 +61,13 @@ public static ValueTask ConnectAsync(this ITcpSocketClient client, string /// public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func, ValueTask> callback) { - if (_callbackCache.TryGetValue(client, out var list)) + if (_cache.TryGetValue(client, out var list)) { list.Add((adapter, cb)); } else { - _callbackCache.Add(client, [(adapter, cb)]); + _cache.Add(client, [(adapter, cb)]); } client.ReceivedCallBack += cb; @@ -89,7 +89,7 @@ async ValueTask cb(ReadOnlyMemory buffer) /// public static void RemoveDataPackageAdapter(this ITcpSocketClient client, Func, ValueTask> callback) { - if (_callbackCache.TryGetValue(client, out var list)) + if (_cache.TryGetValue(client, out var list)) { var items = list.Where(i => i.Adapter.ReceivedCallBack == callback).ToList(); foreach (var c in items) @@ -115,6 +115,17 @@ public static void RemoveDataPackageAdapter(this ITcpSocketClient client, Func. public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func, ValueTask> callback) { + // 释放缓存 + if (_cache.TryGetValue(client, out var list)) + { + var items = list.Where(i => i.Callback == callback).ToList(); + foreach (var item in items) + { + client.ReceivedCallBack -= item.Callback; + list.Remove(item); + } + } + // 设置 ITcpSocketClient 的回调函数 client.ReceivedCallBack = async buffer => { @@ -151,6 +162,16 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPack /// The callback function to be invoked with the converted entity. public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, IDataConverter socketDataConverter, Func callback) { + // 释放缓存 + if (_cache.TryGetValue(client, out var list)) + { + foreach (var (Adapter, Callback) in list) + { + client.ReceivedCallBack -= Callback; + } + list.Clear(); + } + // 设置 ITcpSocketClient 的回调函数 client.ReceivedCallBack = async buffer => { @@ -185,6 +206,16 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, /// The callback function to invoke with the processed entity of type . public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func callback) { + // 释放缓存 + if (_cache.TryGetValue(client, out var list)) + { + foreach (var (Adapter, Callback) in list) + { + client.ReceivedCallBack -= Callback; + } + list.Clear(); + } + // 设置 ITcpSocketClient 的回调函数 client.ReceivedCallBack = async buffer => { From cf15e9d47c50808c65db0a98d06f65b101ba3b70 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 12:18:30 +0800 Subject: [PATCH 10/16] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=20tag=20?= =?UTF-8?q?=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj index 9578a9ec..a88598e0 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj +++ b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj @@ -5,7 +5,7 @@ - BootstrapBlazor Socket + BootstrapBlazor Socket TcpClient BootstrapBlazor extensions of TcpSocket From 4a14f3612fc25d2929132c4ab1cc538ef7f219a2 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 12:18:39 +0800 Subject: [PATCH 11/16] chore: bump version 9.0.1 --- .../BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj index a88598e0..e2f2ddc7 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj +++ b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj @@ -1,7 +1,7 @@  - 9.0.1-beta02 + 9.0.1 From 3d164386f14900f7de0152f9e5f867fcb22e4dd2 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 12:18:47 +0800 Subject: [PATCH 12/16] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=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 --- .../UnitTestTcpSocket/TcpSocketFactoryTest.cs | 26 ++++--------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs index 76673d60..5c2d11dd 100644 --- a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs +++ b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs @@ -496,10 +496,7 @@ public async Task FixLengthDataPackageHandler_Ok() var receivedBuffer = new byte[1024]; // 设置数据适配器 - var adapter = new DataPackageAdapter - { - DataPackageHandler = new FixLengthDataPackageHandler(7) - }; + var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(7)); client.SetDataPackageAdapter(adapter, buffer => { // buffer 即是接收到的数据 @@ -540,11 +537,7 @@ public async Task FixLengthDataPackageHandler_Sticky() var connect = await client.ConnectAsync("localhost", port); // 设置数据适配器 - var adapter = new DataPackageAdapter - { - DataPackageHandler = new FixLengthDataPackageHandler(7) - }; - + var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(7)); client.SetDataPackageAdapter(adapter, buffer => { // buffer 即是接收到的数据 @@ -594,10 +587,7 @@ public async Task DelimiterDataPackageHandler_Ok() var receivedBuffer = new byte[128]; // 设置数据适配器 - var adapter = new DataPackageAdapter - { - DataPackageHandler = new DelimiterDataPackageHandler([13, 10]), - }; + var adapter = new DataPackageAdapter(new DelimiterDataPackageHandler([13, 10])); client.SetDataPackageAdapter(adapter, buffer => { // buffer 即是接收到的数据 @@ -650,10 +640,7 @@ public async Task TryConvertTo_Ok() MockEntity? entity = null; // 设置数据适配器 - var adapter = new DataPackageAdapter - { - DataPackageHandler = new FixLengthDataPackageHandler(29), - }; + var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(29)); client.SetDataPackageAdapter(adapter, new DataConverter(), t => { entity = t; @@ -789,10 +776,7 @@ public async Task TryGetTypeConverter_Ok() var connect = await client.ConnectAsync("localhost", port); // 设置数据适配器 - var adapter = new DataPackageAdapter - { - DataPackageHandler = new FixLengthDataPackageHandler(7) - }; + var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(7)); OptionConvertEntity? entity = null; client.SetDataPackageAdapter(adapter, data => From 797298fd3461e0e0a0a43dfa3d4da61ef25745e4 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 13:36:15 +0800 Subject: [PATCH 13/16] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=20SetDataP?= =?UTF-8?q?ackageAdapter=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ITcpSocketClientExtensions.cs | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index 816ea027..1de3aed6 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -118,12 +118,11 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPack // 释放缓存 if (_cache.TryGetValue(client, out var list)) { - var items = list.Where(i => i.Callback == callback).ToList(); - foreach (var item in items) + foreach (var (Adapter, Callback) in list) { - client.ReceivedCallBack -= item.Callback; - list.Remove(item); + client.ReceivedCallBack -= Callback; } + list.Clear(); } // 设置 ITcpSocketClient 的回调函数 @@ -134,7 +133,7 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPack }; // 设置 DataPackageAdapter 的回调函数 - adapter.ReceivedCallBack = buffer => callback(buffer); + adapter.ReceivedCallBack = callback; } /// @@ -191,6 +190,19 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, }; } + /// + /// 通过指定 数据处理实例,设置数据适配器并配置回调方法 + /// + /// + /// + /// + /// + /// + public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, IDataConverter socketDataConverter, Func callback) + { + client.SetDataPackageAdapter(new DataPackageAdapter(handler), socketDataConverter, callback); + } + /// /// Configures the specified to use a custom data package adapter and callback /// function. From 2ce75446215dfbe1ab6cf3dd4eebd42e06bfbb32 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 13:36:42 +0800 Subject: [PATCH 14/16] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20AddDataPacka?= =?UTF-8?q?geAdapter=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitTestTcpSocket/TcpSocketFactoryTest.cs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs index 5c2d11dd..0f349d8a 100644 --- a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs +++ b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs @@ -800,6 +800,48 @@ public async Task TryGetTypeConverter_Ok() server.Stop(); } + [Fact] + public async Task AddDataPackageAdapter_Ok() + { + var port = 8896; + var server = StartTcpServer(port, MockSplitPackageAsync); + + var client = CreateClient(); + var tcs = new TaskCompletionSource(); + var receivedBuffer = new byte[128]; + var receivedBuffer2 = new byte[128]; + + // 连接 TCP Server + var connect = await client.ConnectAsync("localhost", port); + + client.AddDataPackageAdapter(new DataPackageAdapter(new FixLengthDataPackageHandler(7)), ReceivedCallBack); + client.AddDataPackageAdapter(new DataPackageAdapter(new FixLengthDataPackageHandler(7)), ReceivedCallBack2); + + var data = new ReadOnlyMemory([1, 2, 3, 4, 5]); + await client.SendAsync(data); + + // 等待接收数据处理完成 + await tcs.Task; + client.RemoveDataPackageAdapter(ReceivedCallBack); + client.RemoveDataPackageAdapter(ReceivedCallBack2); + + ValueTask ReceivedCallBack(ReadOnlyMemory buffer) + { + // buffer 即是接收到的数据 + buffer.CopyTo(receivedBuffer); + receivedBuffer = receivedBuffer[..buffer.Length]; + tcs.SetResult(); + return ValueTask.CompletedTask; + } + + ValueTask ReceivedCallBack2(ReadOnlyMemory buffer) + { + // buffer 即是接收到的数据 + buffer.CopyTo(receivedBuffer2); + receivedBuffer2 = receivedBuffer2[..buffer.Length]; + return ValueTask.CompletedTask; + } + } private static TcpListener StartTcpServer(int port, Func handler) { var server = new TcpListener(IPAddress.Loopback, port); From c2a499f9d80abb3ab7859ad8fe8198fe8a0c460c Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 13:37:01 +0800 Subject: [PATCH 15/16] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20SetDataPacka?= =?UTF-8?q?geAdapter=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitTestTcpSocket/TcpSocketFactoryTest.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs index 0f349d8a..ec160527 100644 --- a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs +++ b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs @@ -842,6 +842,38 @@ ValueTask ReceivedCallBack2(ReadOnlyMemory buffer) return ValueTask.CompletedTask; } } + + [Fact] + public async Task SetDataPackageAdapter_Ok() + { + var port = 8897; + var server = StartTcpServer(port, MockSplitPackageAsync); + + var client = CreateClient(); + var tcs = new TaskCompletionSource(); + var receivedBuffer = new byte[128]; + + // 连接 TCP Server + var connect = await client.ConnectAsync("localhost", port); + + client.AddDataPackageAdapter(new DataPackageAdapter(new FixLengthDataPackageHandler(7)), ReceivedCallBack); + client.SetDataPackageAdapter(new FixLengthDataPackageHandler(7), ReceivedCallBack); + + var data = new ReadOnlyMemory([1, 2, 3, 4, 5]); + await client.SendAsync(data); + + // 等待接收数据处理完成 + await tcs.Task; + + ValueTask ReceivedCallBack(ReadOnlyMemory buffer) + { + // buffer 即是接收到的数据 + buffer.CopyTo(receivedBuffer); + receivedBuffer = receivedBuffer[..buffer.Length]; + tcs.SetResult(); + return ValueTask.CompletedTask; + } + } private static TcpListener StartTcpServer(int port, Func handler) { var server = new TcpListener(IPAddress.Loopback, port); From 8c8f744d782f98d12772a96f39b14cafba781599 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 26 Aug 2025 13:45:32 +0800 Subject: [PATCH 16/16] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E6=B3=9B?= =?UTF-8?q?=E5=9E=8B=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitTestTcpSocket/TcpSocketFactoryTest.cs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs index ec160527..a7a1e4d9 100644 --- a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs +++ b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs @@ -874,6 +874,48 @@ ValueTask ReceivedCallBack(ReadOnlyMemory buffer) return ValueTask.CompletedTask; } } + + [Fact] + public async Task SetDataPackageAdapter_Generic() + { + var port = 8898; + var server = StartTcpServer(port, MockSplitPackageAsync); + + var client = CreateClient(); + var tcs = new TaskCompletionSource(); + var receivedBuffer = new byte[128]; + + // 连接 TCP Server + var connect = await client.ConnectAsync("localhost", port); + + client.AddDataPackageAdapter(new DataPackageAdapter(new FixLengthDataPackageHandler(7)), ReceivedCallBack); + client.SetDataPackageAdapter(new FixLengthDataPackageHandler(7), ReceivedEntityCallBack); + + client.AddDataPackageAdapter(new DataPackageAdapter(new FixLengthDataPackageHandler(7)), ReceivedCallBack); + client.SetDataPackageAdapter(new FixLengthDataPackageHandler(7), new MockSocketDataConverter(), ReceivedEntityCallBack); + + var data = new ReadOnlyMemory([1, 2, 3, 4, 5]); + await client.SendAsync(data); + + // 等待接收数据处理完成 + await tcs.Task; + + ValueTask ReceivedCallBack(ReadOnlyMemory buffer) + { + // buffer 即是接收到的数据 + buffer.CopyTo(receivedBuffer); + receivedBuffer = receivedBuffer[..buffer.Length]; + tcs.SetResult(); + return ValueTask.CompletedTask; + } + + Task ReceivedEntityCallBack(MockEntity? entity) + { + tcs.SetResult(); + return Task.CompletedTask; + } + } + private static TcpListener StartTcpServer(int port, Func handler) { var server = new TcpListener(IPAddress.Loopback, port);