Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
<PackageReference Include="BootstrapBlazor.SvgEditor" Version="9.0.3" />
<PackageReference Include="BootstrapBlazor.SummerNote" Version="9.0.4" />
<PackageReference Include="BootstrapBlazor.TableExport" Version="9.2.6" />
<PackageReference Include="BootstrapBlazor.TcpSocket" Version="9.0.0-beta01" />
<PackageReference Include="BootstrapBlazor.Topology" Version="9.0.1" />
<PackageReference Include="BootstrapBlazor.UniverIcon" Version="9.0.1" />
<PackageReference Include="BootstrapBlazor.UniverSheet" Version="9.0.5" />
Expand All @@ -85,6 +86,10 @@

<ItemGroup>
<Using Include="BootstrapBlazor.Components" />
<Using Include="BootstrapBlazor.DataAdapters" />
<Using Include="BootstrapBlazor.DataHandlers" />
<Using Include="BootstrapBlazor.DataConverters" />
<Using Include="BootstrapBlazor.TcpSocket" />
<Using Include="BootstrapBlazor.Server.Components.Components" />
<Using Include="BootstrapBlazor.Server.Components.Layout" />
<Using Include="BootstrapBlazor.Server.Data" />
Expand Down
22 changes: 12 additions & 10 deletions src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
<h3>Tcp 套接字服务 <code>ITcpSocketFactory</code></h3>
<h4>组件库内置了 Socket 套接字通讯服务</h4>

<PackageTips Name="BootstrapBlazor.TcpSocket" />

<p class="code-label">1. 服务注入</p>

<Pre>services.AddBootstrapBlazorTcpSocketFactory();</Pre>
Expand Down Expand Up @@ -84,26 +86,26 @@ private async Task CreateClient()
<p>数据适配器设计思路如下</p>

<ol class="ul-demo">
<li>使用 <code>SocketDataTypeConverterAttribute</code> 标签约定通讯数据使用那个转换类型进行转换 指定类型需继承 <code>ISocketDataConverter</code>
<li>使用 <code>DataTypeConverterAttribute</code> 标签约定通讯数据使用那个转换类型进行转换 指定类型需继承 <code>IDataConverter</code>
接口
</li>
<li>使用 <code>SocketDataPropertyConverterAttribute</code> 标签约定如何转换数据类型 (Property) 属性值</li>
<li>使用 <code>DataPropertyConverterAttribute</code> 标签约定如何转换数据类型 (Property) 属性值</li>
</ol>

<Pre>[SocketDataTypeConverter(Type = typeof(SocketDataConverter&lt;MockEntity&gt;))]
<Pre>[DataTypeConverter(Type = typeof(DataConverter&lt;MockEntity&gt;))]
class MockEntity
{
[SocketDataPropertyConverter(Type = typeof(byte[]), Offset = 0, Length = 5)]
[DataPropertyConverter(Type = typeof(byte[]), Offset = 0, Length = 5)]
public byte[]? Header { get; set; }

[SocketDataPropertyConverter(Type = typeof(byte[]), Offset = 5, Length = 2)]
[DataPropertyConverter(Type = typeof(byte[]), Offset = 5, Length = 2)]
public byte[]? Body { get; set; }

[SocketDataPropertyConverter(Type = typeof(Foo), Offset = 7, Length = 1, ConverterType = typeof(FooConverter), ConverterParameters = ["test"])]
[DataPropertyConverter(Type = typeof(Foo), Offset = 7, Length = 1, ConverterType = typeof(FooConverter), ConverterParameters = ["test"])]
public string? Value1 { get; set; }
}</Pre>

<Pre>class FooConverter(string name) : ISocketDataPropertyConverter
<Pre>class FooConverter(string name) : IDataPropertyConverter
{
public object? Convert(ReadOnlyMemory&lt;byte&gt; data)
{
Expand All @@ -114,15 +116,15 @@ class MockEntity
<p class="code-label">针对第三方程序集的数据类型解决方案如下:</p>
<p>使用 <code></code></p>

<Pre>builder.Services.ConfigureSocketDataConverters(options =>
<Pre>builder.Services.ConfigureDataConverters(options =>
{
options.AddTypeConverter&lt;MockEntity&gt;();
options.AddPropertyConverter&lt;MockEntity&gt;(entity =&gt; entity.Header, new SocketDataPropertyConverterAttribute()
options.AddPropertyConverter&lt;MockEntity&gt;(entity =&gt; entity.Header, new DataPropertyConverterAttribute()
{
Offset = 0,
Length = 5
});
options.AddPropertyConverter&lt;MockEntity&gt;(entity =&gt; entity.Body, new SocketDataPropertyConverterAttribute()
options.AddPropertyConverter&lt;MockEntity&gt;(entity =&gt; entity.Body, new DataPropertyConverterAttribute()
{
Offset = 5,
Length = 2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,74 +8,74 @@
Introduction="@Localizer["NormalIntro"]"
Name="Normal" ShowCode="false">
<p>
通过 <code>SocketDataTypeConverterAttribute</code> 类标签与 <code>SocketDataPropertyConverterAttribute</code>
通过 <code>DataTypeConverterAttribute</code> 类标签与 <code>DataPropertyConverterAttribute</code>
属性标签可以将通讯数据自动转化为我们系统中需要的业务实体类示例如下</p>
<Pre>[SocketDataTypeConverter(Type = typeof(SocketDataConverter&lt;MockEntity&gt;))]
<Pre>[DataTypeConverter(Type = typeof(DataConverter&lt;MockEntity&gt;))]
class MockEntity
{
[SocketDataPropertyConverter(Type = typeof(byte[]), Offset = 0, Length = 5)]
[DataPropertyConverter(Type = typeof(byte[]), Offset = 0, Length = 5)]
public byte[]? Header { get; set; }

[SocketDataPropertyConverter(Type = typeof(byte[]), Offset = 5, Length = 2)]
[DataPropertyConverter(Type = typeof(byte[]), Offset = 5, Length = 2)]
public byte[]? Body { get; set; }

[SocketDataPropertyConverter(Type = typeof(string), Offset = 7, Length = 1, EncodingName = "utf-8")]
[DataPropertyConverter(Type = typeof(string), Offset = 7, Length = 1, EncodingName = "utf-8")]
public string? Value1 { get; set; }

[SocketDataPropertyConverter(Type = typeof(int), Offset = 8, Length = 1)]
[DataPropertyConverter(Type = typeof(int), Offset = 8, Length = 1)]
public int Value2 { get; set; }
}</Pre>
<p class="code-label">1. <code>SocketDataTypeConverter</code> 参数说明</p>
<p class="code-label">1. <code>DataTypeConverter</code> 参数说明</p>
<ul class="ul-demo">
<li><b>Type</b>: 自定义转换器类型,组件库内置了 <code>SocketDataConverter</code> 泛型类建议看一下源码非常方便扩展出自己的转换器
<li><b>Type</b>: 自定义转换器类型,组件库内置了 <code>DataConverter</code> 泛型类建议看一下源码非常方便扩展出自己的转换器
</li>
</ul>
<p class="code-label">2. <code>SocketDataPropertyConverterAttribute</code> 参数说明</p>
<p class="code-label">2. <code>DataPropertyConverterAttribute</code> 参数说明</p>
<ul class="ul-demo">
<li><b>Type</b>: 转换目标数据类型</li>
<li><b>Offset</b>: 数据偏移量即在接收到的数据中起始位置</li>
<li><b>Length</b>: 数据长度,即在接收到的数据中占的长度</li>
<li><b>EncodingName</b>: 转成字符串时需要的编码名称,默认 null 使用 <code>utf-8</code> 编码</li>
<li><b>ConverterType</b>: 自定义转化器类型,继承 <code>ISocketDataPropertyConverter</code> 接口</li>
<li><b>ConverterType</b>: 自定义转化器类型,继承 <code>IDataPropertyConverter</code> 接口</li>
<li><b>ConverterParameters</b>: 自定义转化器类型构造函数所需的参数默认 null</li>
</ul>
<p>组件库内置了大量数据类型转换器</p>
<ul class="ul-demo">
<li><code>SocketDataByteArrayConverter</code> 转成 byte[] 数组类型</li>
<li><code>SocketDataStringConverter</code> 转成 string 字符串类型</li>
<li><code>SocketDataEnumConverter</code> 转成 enum 枚举类型</li>
<li><code>SocketDataBoolConverter</code> 转成 bool 布尔类型</li>
<li><code>SocketDataInt16BigEndianConverter</code> 转成 short 整形大端读取</li>
<li><code>SocketDataInt32BigEndianConverter</code> 转成 int 整形大端读取</li>
<li><code>SocketDataInt64BigEndianConverter</code> 转成 long 长整形大端读取</li>
<li><code>SocketDataSingleBigEndianConverter</code> 转成 float 单精度浮点数大端读取</li>
<li><code>SocketDataDoubleBigEndianConverter</code> 转成 double 双精度浮点数大端读取</li>
<li><code>SocketDataUInt16BigEndianConverter</code> 转成 ushort 无符号整形大端读取</li>
<li><code>SocketDataUInt32BigEndianConverter</code> 转成 uint 无符号整形大端读取</li>
<li><code>SocketDataUInt64BigEndianConverter</code> 转成 ulong 无符号长整形大端读取</li>
<li><code>SocketDataInt16LittleEndianConverter</code> 转成 short 整形小端读取</li>
<li><code>SocketDataInt32LittleEndianConverter</code> 转成 int 整形小端读取</li>
<li><code>SocketDataInt64LittleEndianConverter</code> 转成 long 长整形小端读取</li>
<li><code>SocketDataSingleLittleEndianConverter</code> 转成 float 单精度浮点数小端读取</li>
<li><code>SocketDataDoubleLittleEndianConverter</code> 转成 double 双精度浮点数小端读取</li>
<li><code>SocketDataUInt16LittleEndianConverter</code> 转成 ushort 无符号整形小端读取</li>
<li><code>SocketDataUInt32LittleEndianConverter</code> 转成 uint 无符号整形小端读取</li>
<li><code>SocketDataUInt64LittleEndianConverter</code> 转成 ulong 无符号整形小端读取</li>
<li><code>DataByteArrayConverter</code> 转成 byte[] 数组类型</li>
<li><code>DataStringConverter</code> 转成 string 字符串类型</li>
<li><code>DataEnumConverter</code> 转成 enum 枚举类型</li>
<li><code>DataBoolConverter</code> 转成 bool 布尔类型</li>
<li><code>DataInt16BigEndianConverter</code> 转成 short 整形大端读取</li>
<li><code>DataInt32BigEndianConverter</code> 转成 int 整形大端读取</li>
<li><code>DataInt64BigEndianConverter</code> 转成 long 长整形大端读取</li>
<li><code>DataSingleBigEndianConverter</code> 转成 float 单精度浮点数大端读取</li>
<li><code>DataDoubleBigEndianConverter</code> 转成 double 双精度浮点数大端读取</li>
<li><code>DataUInt16BigEndianConverter</code> 转成 ushort 无符号整形大端读取</li>
<li><code>DataUInt32BigEndianConverter</code> 转成 uint 无符号整形大端读取</li>
<li><code>DataUInt64BigEndianConverter</code> 转成 ulong 无符号长整形大端读取</li>
<li><code>DataInt16LittleEndianConverter</code> 转成 short 整形小端读取</li>
<li><code>DataInt32LittleEndianConverter</code> 转成 int 整形小端读取</li>
<li><code>DataInt64LittleEndianConverter</code> 转成 long 长整形小端读取</li>
<li><code>DataSingleLittleEndianConverter</code> 转成 float 单精度浮点数小端读取</li>
<li><code>DataDoubleLittleEndianConverter</code> 转成 double 双精度浮点数小端读取</li>
<li><code>DataUInt16LittleEndianConverter</code> 转成 ushort 无符号整形小端读取</li>
<li><code>DataUInt32LittleEndianConverter</code> 转成 uint 无符号整形小端读取</li>
<li><code>DataUInt64LittleEndianConverter</code> 转成 ulong 无符号整形小端读取</li>
</ul>
<p>自定义数据类型转化器示例</p>
<Pre>[SocketTypeDataConverter(Type = typeof(SocketDataConverter&lt;MockEntity&gt;))]
<Pre>[SocketTypeDataConverter(Type = typeof(DataConverter&lt;MockEntity&gt;))]
class MockEntity
{
[SocketDataPropertyConverter(Type = typeof(byte[]), Offset = 0, Length = 5)]
[DataPropertyConverter(Type = typeof(byte[]), Offset = 0, Length = 5)]
public byte[]? Header { get; set; }

[SocketDataPropertyConverter(Type = typeof(byte[]), Offset = 5, Length = 2)]
[DataPropertyConverter(Type = typeof(byte[]), Offset = 5, Length = 2)]
public byte[]? Body { get; set; }

[SocketDataPropertyConverter(Type = typeof(Foo), Offset = 7, Length = 1, ConverterType = typeof(FooConverter), ConverterParameters = ["test"])]
[DataPropertyConverter(Type = typeof(Foo), Offset = 7, Length = 1, ConverterType = typeof(FooConverter), ConverterParameters = ["test"])]
public string? Value1 { get; set; }
}</Pre>
<Pre>class FooConverter(string name) : ISocketDataPropertyConverter
<Pre>class FooConverter(string name) : IDataPropertyConverter
{
public object? Convert(ReadOnlyMemory&lt;byte&gt; data)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
<Tips>
<p><code>ITcpSocketFactory</code> 服务仅在 <code>Server</code> 模式下可用</p>
</Tips>

<PackageTips Name="BootstrapBlazor.TcpSocket" />
2 changes: 1 addition & 1 deletion src/BootstrapBlazor.Server/Locales/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -7129,7 +7129,7 @@
"DataEntityTitle": "Socket Auto Entity",
"DataEntityDescription": "After receiving the communication data, it is automatically converted into the entity class required by the business",
"NormalTitle": "Basic usage",
"NormalIntro": "Enable automatic data conversion through the <code>SocketDataTypeConverterAttribute</code> attribute"
"NormalIntro": "Enable automatic data conversion through the <code>DataTypeConverterAttribute</code> attribute"
},
"BootstrapBlazor.Server.Components.Samples.NetworkMonitors": {
"NetworkMonitorTitle": "NetworkMonitor",
Expand Down
2 changes: 1 addition & 1 deletion src/BootstrapBlazor.Server/Locales/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -7129,7 +7129,7 @@
"DataEntityTitle": "Socket 数据转化实体类",
"DataEntityDescription": "接收到通讯数据后自动转成业务需要的实体类",
"NormalTitle": "基本用法",
"NormalIntro": "通过 <code>SocketDataTypeConverterAttribute</code> 标签开启数据自动转换功能"
"NormalIntro": "通过 <code>DataTypeConverterAttribute</code> 标签开启数据自动转换功能"
},
"BootstrapBlazor.Server.Components.Samples.NetworkMonitors": {
"NetworkMonitorTitle": "NetworkMonitor 网络状态",
Expand Down
Loading