From 794cddeea96f53fc528d9a8a292c07d68e82dae9 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 14:17:34 +0800 Subject: [PATCH 01/10] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20Set=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ITcpSocketClientExtensions.cs | 110 ++++++------------ 1 file changed, 36 insertions(+), 74 deletions(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index b3814fbf..8458b292 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -61,6 +61,12 @@ public static ValueTask ConnectAsync(this ITcpSocketClient client, string /// public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func, ValueTask> callback) { + async ValueTask cb(ReadOnlyMemory buffer) + { + // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 + await adapter.HandlerAsync(buffer); + } + if (_cache.TryGetValue(client, out var list)) { list.Add((adapter, cb)); @@ -74,12 +80,6 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPack // 设置 DataPackageAdapter 的回调函数 adapter.ReceivedCallBack = callback; - - async ValueTask cb(ReadOnlyMemory buffer) - { - // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 - await adapter.HandlerAsync(buffer); - } } /// @@ -100,51 +100,15 @@ public static void RemoveDataPackageAdapter(this ITcpSocketClient client, Func - /// Configures the specified to use the provided - /// for processing received data and sets a callback to handle processed data. - /// - /// This method sets up a two-way data processing pipeline: - /// The is configured to pass received data to the - /// for processing. The is configured to invoke - /// the provided with the processed data. Use this method - /// to integrate a custom data processing adapter with a TCP socket client. - /// The instance to configure. - /// The used to process incoming data. - /// A callback function invoked with the processed data. The function receives a - /// containing the processed data and returns a . - public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func, ValueTask> callback) - { - // 释放缓存 - if (_cache.TryGetValue(client, out var list)) - { - foreach (var (Adapter, Callback) in list) - { - client.ReceivedCallBack -= Callback; - } - list.Clear(); - } - - // 设置 ITcpSocketClient 的回调函数 - client.ReceivedCallBack = async buffer => - { - // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 - await adapter.HandlerAsync(buffer); - }; - - // 设置 DataPackageAdapter 的回调函数 - adapter.ReceivedCallBack = callback; - } - /// /// 通过指定 数据处理实例,设置数据适配器并配置回调方法 /// /// 实例 /// 数据处理实例 /// 回调方法 - public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, Func, ValueTask> callback) + public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, Func, ValueTask> callback) { - client.SetDataPackageAdapter(new DataPackageAdapter(handler), callback); + client.AddDataPackageAdapter(new DataPackageAdapter(handler), callback); } /// @@ -159,24 +123,24 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPack /// The data package adapter responsible for handling incoming data. /// The converter used to transform the received data into the specified entity type. /// The callback function to be invoked with the converted entity. - public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, IDataConverter socketDataConverter, Func callback) + public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, IDataConverter socketDataConverter, Func callback) { - // 释放缓存 - if (_cache.TryGetValue(client, out var list)) + async ValueTask cb(ReadOnlyMemory buffer) { - foreach (var (Adapter, Callback) in list) - { - client.ReceivedCallBack -= Callback; - } - list.Clear(); + // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 + await adapter.HandlerAsync(buffer); } - // 设置 ITcpSocketClient 的回调函数 - client.ReceivedCallBack = async buffer => + if (_cache.TryGetValue(client, out var list)) { - // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 - await adapter.HandlerAsync(buffer); - }; + list.Add((adapter, cb)); + } + else + { + _cache.Add(client, [(adapter, cb)]); + } + + client.ReceivedCallBack += cb; // 设置 DataPackageAdapter 的回调函数 adapter.ReceivedCallBack = async buffer => @@ -198,9 +162,9 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, /// /// /// - public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, IDataConverter socketDataConverter, Func callback) + public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, IDataConverter socketDataConverter, Func callback) { - client.SetDataPackageAdapter(new DataPackageAdapter(handler), socketDataConverter, callback); + client.AddDataPackageAdapter(new DataPackageAdapter(handler), socketDataConverter, callback); } /// @@ -216,24 +180,22 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, /// The TCP socket client to configure. /// The data package adapter responsible for processing incoming data. /// The callback function to invoke with the processed entity of type . - public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func callback) + public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func callback) { - // 释放缓存 - if (_cache.TryGetValue(client, out var list)) + async ValueTask cb(ReadOnlyMemory buffer) { - foreach (var (Adapter, Callback) in list) - { - client.ReceivedCallBack -= Callback; - } - list.Clear(); + // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 + await adapter.HandlerAsync(buffer); } - // 设置 ITcpSocketClient 的回调函数 - client.ReceivedCallBack = async buffer => + if (_cache.TryGetValue(client, out var list)) { - // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 - await adapter.HandlerAsync(buffer); - }; + list.Add((adapter, cb)); + } + else + { + _cache.Add(client, [(adapter, cb)]); + } IDataConverter? converter = null; @@ -268,9 +230,9 @@ public static void SetDataPackageAdapter(this ITcpSocketClient client, /// 实例 /// 数据处理实例 /// 回调方法 - public static void SetDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, Func callback) + public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageHandler handler, Func callback) { - client.SetDataPackageAdapter(new DataPackageAdapter(handler), callback); + client.AddDataPackageAdapter(new DataPackageAdapter(handler), callback); } private static void SetDataAdapterCallback(this IDataPackageAdapter adapter, IDataConverter converter, Func callback) From 699fd0687990793df876ae71f84e0b65740a3041 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 14:24:20 +0800 Subject: [PATCH 02/10] =?UTF-8?q?refactor:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E9=9D=99=E6=80=81=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ITcpSocketClientExtensions.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index 8458b292..0a830907 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -20,7 +20,7 @@ public static class ITcpSocketClientExtensions /// Sends the specified string content to the connected TCP socket client asynchronously. /// /// This method converts the provided string content into a byte array using the specified - /// encoding (or UTF-8 by default) and sends it to the connected TCP socket client. Ensure the client is connected + /// encoding (or UTF-8 by default) and sends it to the connected TCP socket client. Ensure the client is connected /// before calling this method. /// The TCP socket client to which the content will be sent. Cannot be . /// The string content to send. Cannot be or empty. @@ -51,7 +51,7 @@ public static ValueTask ConnectAsync(this ITcpSocketClient client, string return client.ConnectAsync(endPoint, token); } - private static readonly Dictionary, ValueTask> Callback)>> _cache = []; + private static readonly Dictionary, ValueTask> Callback)>> Cache = []; /// /// 增加 数据适配器及其对应的回调方法 @@ -67,13 +67,13 @@ async ValueTask cb(ReadOnlyMemory buffer) await adapter.HandlerAsync(buffer); } - if (_cache.TryGetValue(client, out var list)) + if (Cache.TryGetValue(client, out var list)) { list.Add((adapter, cb)); } else { - _cache.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 (_cache.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) @@ -131,13 +131,13 @@ async ValueTask cb(ReadOnlyMemory buffer) await adapter.HandlerAsync(buffer); } - if (_cache.TryGetValue(client, out var list)) + if (Cache.TryGetValue(client, out var list)) { list.Add((adapter, cb)); } else { - _cache.Add(client, [(adapter, cb)]); + Cache.Add(client, [(adapter, cb)]); } client.ReceivedCallBack += cb; @@ -188,13 +188,13 @@ async ValueTask cb(ReadOnlyMemory buffer) await adapter.HandlerAsync(buffer); } - if (_cache.TryGetValue(client, out var list)) + if (Cache.TryGetValue(client, out var list)) { list.Add((adapter, cb)); } else { - _cache.Add(client, [(adapter, cb)]); + Cache.Add(client, [(adapter, cb)]); } IDataConverter? converter = null; From 9855ffb83db6d2bbd17682f48e0897ced139a6dc Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 14:38:35 +0800 Subject: [PATCH 03/10] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ITcpSocketClientExtensions.cs | 62 ++++++++++++------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index 0a830907..30e4ff3a 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -61,7 +61,7 @@ public static ValueTask ConnectAsync(this ITcpSocketClient client, string /// public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func, ValueTask> callback) { - async ValueTask cb(ReadOnlyMemory buffer) + async ValueTask ReceivedCallback(ReadOnlyMemory buffer) { // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 await adapter.HandlerAsync(buffer); @@ -69,14 +69,14 @@ async ValueTask cb(ReadOnlyMemory buffer) if (Cache.TryGetValue(client, out var list)) { - list.Add((adapter, cb)); + list.Add((adapter, ReceivedCallback)); } else { - Cache.Add(client, [(adapter, cb)]); + Cache.Add(client, [(adapter, ReceivedCallback)]); } - client.ReceivedCallBack += cb; + client.ReceivedCallBack += ReceivedCallback; // 设置 DataPackageAdapter 的回调函数 adapter.ReceivedCallBack = callback; @@ -111,6 +111,8 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPack client.AddDataPackageAdapter(new DataPackageAdapter(handler), callback); } + private static readonly Dictionary> EntityCache = []; + /// /// Configures the specified to use a data package adapter and a callback function /// for processing received data. @@ -125,22 +127,22 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPack /// The callback function to be invoked with the converted entity. public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, IDataConverter socketDataConverter, Func callback) { - async ValueTask cb(ReadOnlyMemory buffer) + async ValueTask ReceivedCallback(ReadOnlyMemory buffer) { // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 await adapter.HandlerAsync(buffer); } - if (Cache.TryGetValue(client, out var list)) + if (EntityCache.TryGetValue(client, out var list)) { - list.Add((adapter, cb)); + list.Add((adapter, ReceivedCallback)); } else { - Cache.Add(client, [(adapter, cb)]); + Cache.Add(client, [(adapter, ReceivedCallback)]); } - client.ReceivedCallBack += cb; + client.ReceivedCallBack += ReceivedCallback; // 设置 DataPackageAdapter 的回调函数 adapter.ReceivedCallBack = async buffer => @@ -182,35 +184,31 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, /// The callback function to invoke with the processed entity of type . public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func callback) { - async ValueTask cb(ReadOnlyMemory buffer) + async ValueTask ReceivedCallback(ReadOnlyMemory buffer) { // 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调 await adapter.HandlerAsync(buffer); } - if (Cache.TryGetValue(client, out var list)) + if (EntityCache.TryGetValue(client, out var list)) { - list.Add((adapter, cb)); + list.Add((adapter, ReceivedCallback)); } else { - Cache.Add(client, [(adapter, cb)]); + EntityCache.Add(client, [(adapter, ReceivedCallback)]); } IDataConverter? converter = null; var type = typeof(TEntity); var converterType = type.GetCustomAttribute(); - if (converterType is { Type: not null }) - { - // 如果类型上有 SocketDataTypeConverterAttribute 特性则使用特性中指定的转换器 - converter = converterType.Type.CreateInstance>(); - } - else - { - // 如果没有特性则从 ITcpSocketClient 中的服务容器获取转换器 - converter = client.GetSocketDataConverter(); - } + + // 如果类型上有 SocketDataTypeConverterAttribute 特性则使用特性中指定的转换器 + // 如果没有特性则从 ITcpSocketClient 中的服务容器获取转换器 + converter = converterType is { Type: not null } + ? converterType.Type.CreateInstance>() + : client.GetSocketDataConverter(); if (converter == null) { @@ -261,4 +259,22 @@ private static void SetDataAdapterCallback(this IDataPackageAdapter ada } return converter; } + + /// + /// 移除 数据适配器及其对应的回调方法 + /// + /// + /// + public static void RemoveDataPackageAdapter(this ITcpSocketClient client, Func callback) + { + if (EntityCache.TryGetValue(client, out var list)) + { + var items = list.Where(i => i.Adapter.ReceivedCallBack == callback).ToList(); + foreach (var c in items) + { + client.ReceivedCallBack -= c.Callback; + list.Remove(c); + } + } + } } From f842f1ad6bb7cb9dd64d2d4fdaa8307bd26f2df9 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 14:56:14 +0800 Subject: [PATCH 04/10] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataConverter/DataConverter.cs | 25 +++++-- .../Extensions/ITcpSocketClientExtensions.cs | 73 +++++++++---------- 2 files changed, 54 insertions(+), 44 deletions(-) diff --git a/src/extensions/BootstrapBlazor.Socket/DataConverter/DataConverter.cs b/src/extensions/BootstrapBlazor.Socket/DataConverter/DataConverter.cs index be7e3736..1fe38f24 100644 --- a/src/extensions/BootstrapBlazor.Socket/DataConverter/DataConverter.cs +++ b/src/extensions/BootstrapBlazor.Socket/DataConverter/DataConverter.cs @@ -17,7 +17,6 @@ public class DataConverter(DataConverterCollections converters) : IData /// public DataConverter() : this(new()) { - } /// @@ -28,9 +27,21 @@ public DataConverter() : this(new()) /// public virtual bool TryConvertTo(ReadOnlyMemory data, [NotNullWhen(true)] out TEntity? entity) { - var v = CreateEntity(); - var ret = Parse(data, v); - entity = ret ? v : default; + var ret = false; + entity = default; + try + { + var v = CreateEntity(); + if (Parse(data, v)) + { + entity = v; + ret = true; + } + } + catch (Exception e) + { + } + return ret; } @@ -57,8 +68,7 @@ protected virtual bool Parse(ReadOnlyMemory data, TEntity entity) var properties = entity.GetType().GetProperties().Where(p => p.CanWrite).ToList(); foreach (var p in properties) { - var attr = p.GetCustomAttribute(false) - ?? GetPropertyConverterAttribute(p); + var attr = p.GetCustomAttribute(false) ?? GetPropertyConverterAttribute(p); if (attr is { Type: not null }) { var value = attr.ConvertTo(data); @@ -69,8 +79,10 @@ protected virtual bool Parse(ReadOnlyMemory data, TEntity entity) } } } + ret = true; } + return ret; } @@ -81,6 +93,7 @@ protected virtual bool Parse(ReadOnlyMemory data, TEntity entity) { attr = v; } + return attr; } } diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index 30e4ff3a..980a77c3 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -111,7 +111,7 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPack client.AddDataPackageAdapter(new DataPackageAdapter(handler), callback); } - private static readonly Dictionary> EntityCache = []; + private static readonly Dictionary, ValueTask> ReceivedCallback, Delegate EntityCallback)>> EntityCache = []; /// /// Configures the specified to use a data package adapter and a callback function @@ -135,11 +135,11 @@ async ValueTask ReceivedCallback(ReadOnlyMemory buffer) if (EntityCache.TryGetValue(client, out var list)) { - list.Add((adapter, ReceivedCallback)); + list.Add((ReceivedCallback, callback)); } else { - Cache.Add(client, [(adapter, ReceivedCallback)]); + EntityCache.Add(client, [(ReceivedCallback, callback)]); } client.ReceivedCallBack += ReceivedCallback; @@ -156,6 +156,24 @@ async ValueTask ReceivedCallback(ReadOnlyMemory buffer) }; } + /// + /// 移除 数据适配器及其对应的回调方法 + /// + /// + /// + public static void RemoveDataPackageAdapter(this ITcpSocketClient client, Func callback) + { + if (EntityCache.TryGetValue(client, out var list)) + { + var items = list.Where(i => i.EntityCallback.Equals(callback)).ToList(); + foreach (var c in items) + { + client.ReceivedCallBack -= c.ReceivedCallback; + list.Remove(c); + } + } + } + /// /// 通过指定 数据处理实例,设置数据适配器并配置回调方法 /// @@ -192,13 +210,15 @@ async ValueTask ReceivedCallback(ReadOnlyMemory buffer) if (EntityCache.TryGetValue(client, out var list)) { - list.Add((adapter, ReceivedCallback)); + list.Add((ReceivedCallback, callback)); } else { - EntityCache.Add(client, [(adapter, ReceivedCallback)]); + EntityCache.Add(client, [(ReceivedCallback, callback)]); } + client.ReceivedCallBack += ReceivedCallback; + IDataConverter? converter = null; var type = typeof(TEntity); @@ -212,13 +232,21 @@ async ValueTask ReceivedCallback(ReadOnlyMemory buffer) if (converter == null) { - // 设置正常回调 + // 未设置数据转换器返回 default 值 adapter.ReceivedCallBack = async buffer => await callback(default); } else { // 设置转化器 - adapter.SetDataAdapterCallback(converter, callback); + adapter.ReceivedCallBack = async buffer => + { + TEntity? ret = default; + if (converter.TryConvertTo(buffer, out var t)) + { + ret = t; + } + await callback(ret); + }; } } @@ -233,19 +261,6 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, client.AddDataPackageAdapter(new DataPackageAdapter(handler), callback); } - private static void SetDataAdapterCallback(this IDataPackageAdapter adapter, IDataConverter converter, Func callback) - { - adapter.ReceivedCallBack = async buffer => - { - TEntity? ret = default; - if (converter.TryConvertTo(buffer, out var t)) - { - ret = t; - } - await callback(ret); - }; - } - private static IDataConverter? GetSocketDataConverter(this ITcpSocketClient client) { IDataConverter? converter = null; @@ -259,22 +274,4 @@ private static void SetDataAdapterCallback(this IDataPackageAdapter ada } return converter; } - - /// - /// 移除 数据适配器及其对应的回调方法 - /// - /// - /// - public static void RemoveDataPackageAdapter(this ITcpSocketClient client, Func callback) - { - if (EntityCache.TryGetValue(client, out var list)) - { - var items = list.Where(i => i.Adapter.ReceivedCallBack == callback).ToList(); - foreach (var c in items) - { - client.ReceivedCallBack -= c.Callback; - list.Remove(c); - } - } - } } From 744da2acaa3e025325974ad4d760e0aed4693704 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 15:18:53 +0800 Subject: [PATCH 05/10] =?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 --- .../DataConverter/DataConverter.cs | 4 +--- .../UnitTestTcpSocket/TcpSocketFactoryTest.cs | 23 ++++++++++--------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/extensions/BootstrapBlazor.Socket/DataConverter/DataConverter.cs b/src/extensions/BootstrapBlazor.Socket/DataConverter/DataConverter.cs index 1fe38f24..9af5aa74 100644 --- a/src/extensions/BootstrapBlazor.Socket/DataConverter/DataConverter.cs +++ b/src/extensions/BootstrapBlazor.Socket/DataConverter/DataConverter.cs @@ -38,9 +38,7 @@ public virtual bool TryConvertTo(ReadOnlyMemory data, [NotNullWhen(true)] ret = true; } } - catch (Exception e) - { - } + catch { } return ret; } diff --git a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs index bbe8a6f6..ea9368f0 100644 --- a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs +++ b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs @@ -497,7 +497,7 @@ public async Task FixLengthDataPackageHandler_Ok() // 设置数据适配器 var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(7)); - client.SetDataPackageAdapter(adapter, buffer => + var callback = new Func, ValueTask>(buffer => { // buffer 即是接收到的数据 buffer.CopyTo(receivedBuffer); @@ -505,6 +505,7 @@ public async Task FixLengthDataPackageHandler_Ok() tcs.SetResult(); return ValueTask.CompletedTask; }); + client.AddDataPackageAdapter(adapter, callback); // 测试 ConnectAsync 方法 var connect = await client.ConnectAsync("localhost", port); @@ -538,7 +539,7 @@ public async Task FixLengthDataPackageHandler_Sticky() // 设置数据适配器 var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(7)); - client.SetDataPackageAdapter(adapter, buffer => + client.AddDataPackageAdapter(adapter, buffer => { // buffer 即是接收到的数据 buffer.CopyTo(receivedBuffer); @@ -588,7 +589,7 @@ public async Task DelimiterDataPackageHandler_Ok() // 设置数据适配器 var adapter = new DataPackageAdapter(new DelimiterDataPackageHandler([13, 10])); - client.SetDataPackageAdapter(adapter, buffer => + client.AddDataPackageAdapter(adapter, buffer => { // buffer 即是接收到的数据 buffer.CopyTo(receivedBuffer); @@ -641,7 +642,7 @@ public async Task TryConvertTo_Ok() // 设置数据适配器 var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(29)); - client.SetDataPackageAdapter(adapter, new DataConverter(), t => + client.AddDataPackageAdapter(adapter, new DataConverter(), t => { entity = t; tcs.SetResult(); @@ -706,7 +707,7 @@ public async Task TryConvertTo_Ok() // 测试 SocketDataConverter 标签功能 tcs = new TaskCompletionSource(); - client.SetDataPackageAdapter(adapter, t => + client.AddDataPackageAdapter(adapter, t => { entity = t; tcs.SetResult(); @@ -728,7 +729,7 @@ public async Task TryConvertTo_Ok() // 测试 SetDataPackageAdapter 泛型无标签情况 tcs = new TaskCompletionSource(); NoConvertEntity? noConvertEntity = null; - client.SetDataPackageAdapter(adapter, t => + client.AddDataPackageAdapter(adapter, t => { noConvertEntity = t; tcs.SetResult(); @@ -779,7 +780,7 @@ public async Task TryGetTypeConverter_Ok() var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(7)); OptionConvertEntity? entity = null; - client.SetDataPackageAdapter(adapter, data => + client.AddDataPackageAdapter(adapter, data => { // buffer 即是接收到的数据 entity = data; @@ -857,7 +858,7 @@ public async Task SetDataPackageAdapter_Ok() var connect = await client.ConnectAsync("localhost", port); client.AddDataPackageAdapter(new DataPackageAdapter(new FixLengthDataPackageHandler(7)), ReceivedCallBack); - client.SetDataPackageAdapter(new FixLengthDataPackageHandler(7), ReceivedCallBack); + client.AddDataPackageAdapter(new FixLengthDataPackageHandler(7), ReceivedCallBack); var data = new ReadOnlyMemory([1, 2, 3, 4, 5]); await client.SendAsync(data); @@ -889,10 +890,10 @@ public async Task SetDataPackageAdapter_Generic() var connect = await client.ConnectAsync("localhost", port); client.AddDataPackageAdapter(new DataPackageAdapter(new FixLengthDataPackageHandler(7)), ReceivedCallBack); - client.SetDataPackageAdapter(new FixLengthDataPackageHandler(7), ReceivedEntityCallBack); + client.AddDataPackageAdapter(new FixLengthDataPackageHandler(7), ReceivedEntityCallBack); client.AddDataPackageAdapter(new DataPackageAdapter(new FixLengthDataPackageHandler(7)), ReceivedCallBack); - client.SetDataPackageAdapter(new FixLengthDataPackageHandler(7), new MockSocketDataConverter(), ReceivedEntityCallBack); + client.AddDataPackageAdapter(new FixLengthDataPackageHandler(7), new MockSocketDataConverter(), ReceivedEntityCallBack); var data = new ReadOnlyMemory([1, 2, 3, 4, 5]); await client.SendAsync(data); @@ -930,7 +931,7 @@ public async Task Convert_Ok() // 连接 TCP Server var connect = await client.ConnectAsync("localhost", port); - client.SetDataPackageAdapter(new FixLengthDataPackageHandler(7), ReceivedCallBack); + client.AddDataPackageAdapter(new FixLengthDataPackageHandler(7), ReceivedCallBack); var data = new ReadOnlyMemory([1, 2, 3, 4, 5]); await client.SendAsync(data); From 775c8238bd697fa2ae3a46aed607de11c42aa4e8 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 15:23:24 +0800 Subject: [PATCH 06/10] chore: bump version 9.0.4 --- .../BootstrapBlazor.Socket/BootstrapBlazor.Socket.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/BootstrapBlazor.Socket/BootstrapBlazor.Socket.csproj b/src/extensions/BootstrapBlazor.Socket/BootstrapBlazor.Socket.csproj index 311732a6..ec3b5606 100644 --- a/src/extensions/BootstrapBlazor.Socket/BootstrapBlazor.Socket.csproj +++ b/src/extensions/BootstrapBlazor.Socket/BootstrapBlazor.Socket.csproj @@ -1,7 +1,7 @@  - 9.0.3 + 9.0.4 From a9fe0eca0d3f8553126b307c239394d8524a0fdb Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 15:23:30 +0800 Subject: [PATCH 07/10] chore: bump version 9.0.3 --- .../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 da28547c..6d93a968 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj +++ b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj @@ -1,7 +1,7 @@  - 9.0.2 + 9.0.3 From 3bdda01283f62ea12fb09e9e4cfd57fbb577b72d Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 15:34:49 +0800 Subject: [PATCH 08/10] =?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 --- test/UnitTestTcpSocket/TcpSocketFactoryTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs index ea9368f0..0b524042 100644 --- a/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs +++ b/test/UnitTestTcpSocket/TcpSocketFactoryTest.cs @@ -642,12 +642,13 @@ public async Task TryConvertTo_Ok() // 设置数据适配器 var adapter = new DataPackageAdapter(new FixLengthDataPackageHandler(29)); - client.AddDataPackageAdapter(adapter, new DataConverter(), t => + var callback = new Func(t => { entity = t; tcs.SetResult(); return Task.CompletedTask; }); + client.AddDataPackageAdapter(adapter, new DataConverter(), callback); // 连接 TCP Server var connect = await client.ConnectAsync("localhost", port); @@ -704,6 +705,7 @@ public async Task TryConvertTo_Ok() // no attribute Assert.Null(entity.Value13); + client.RemoveDataPackageAdapter(callback); // 测试 SocketDataConverter 标签功能 tcs = new TaskCompletionSource(); From 122d4b3446a8d4484719ab676f0eb5a17a472fdd Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 15:39:18 +0800 Subject: [PATCH 09/10] =?UTF-8?q?doc:=20=E5=A2=9E=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ITcpSocketClientExtensions.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs index 980a77c3..a2d21b50 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs +++ b/src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs @@ -101,7 +101,7 @@ public static void RemoveDataPackageAdapter(this ITcpSocketClient client, Func - /// 通过指定 数据处理实例,设置数据适配器并配置回调方法 + /// 通过指定 数据处理实例,设置数据适配器并配置回调方法,切记使用 移除数据处理委托防止内存泄露 /// /// 实例 /// 数据处理实例 @@ -115,7 +115,7 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPack /// /// Configures the specified to use a data package adapter and a callback function - /// for processing received data. + /// for processing received data. 切记使用 移除数据处理委托防止内存泄露 /// /// This method sets up the to process incoming data using the /// specified and . The (this ITcpSocketClient clien } /// - /// 通过指定 数据处理实例,设置数据适配器并配置回调方法 + /// 通过指定 数据处理实例,设置数据适配器并配置回调方法。切记使用 移除数据处理委托防止内存泄露 /// /// /// @@ -189,7 +189,7 @@ public static void AddDataPackageAdapter(this ITcpSocketClient client, /// /// Configures the specified to use a custom data package adapter and callback - /// function. + /// function. 切记使用 移除数据处理委托防止内存泄露 /// /// This method sets up the to use the specified for handling incoming data. If the type is decorated with a buffer) } /// - /// 通过指定 数据处理实例,设置数据适配器并配置回调方法 + /// 通过指定 数据处理实例,设置数据适配器并配置回调方法。切记使用 移除数据处理委托防止内存泄露 /// /// 实例 /// 数据处理实例 From e6cb0690e5ff0e5e2a5424c3306adce5c0978717 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 27 Aug 2025 15:40:21 +0800 Subject: [PATCH 10/10] chore: bump version 9.0.4 --- .../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 6d93a968..e94abb08 100644 --- a/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj +++ b/src/extensions/BootstrapBlazor.TcpSocket/BootstrapBlazor.TcpSocket.csproj @@ -1,7 +1,7 @@  - 9.0.3 + 9.0.4