diff --git a/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor b/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor new file mode 100644 index 00000000000..267c5c135c9 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor @@ -0,0 +1,66 @@ +@page "/socket-factory" +@inject IStringLocalizer Localizer + +

Tcp 套接字服务 ITcpSocketFactory

+

组件库内置了 Socket 套接字通讯服务

+ +

1. 服务注入

+ +
[Inject]
+[NotNull]
+private ITcpSocketFactory? TcpSocketFactory { get; set; }
+ +

2. 使用服务

+

调用 TcpSocketFactory 实例方法 GetOrCreate 即可得到一个 ITcpSocketClient 实例。内部提供复用机制,调用两次得到的 ITcpSocketClient 为同一对象

+ +
var client = factory.GetOrCreate("192.168.1.100", 0);
+ +

3. 使用方法

+ + + +

4. 数据处理器

+ +

在我们实际应用中,建立套接字连接后就会进行数据通信,数据通信不会是杂乱无章的随机数据,在应用中都是有双方遵守的规约简称通讯协议,在通讯协议的约束下,发送方与接收方均根据通讯协议进行编码或解码工作,将数据有条不紊的传输

+ +

数据处理器设计初衷就是为了契合通讯协议大大简化我们开发逻辑,我们已通讯协议每次通讯电文均为 4 位定长举例说明,在实际的通讯过程中,我们接收到的通讯数据存在粘包或者分包的现象

+ + + +

我们内置了 IDataPackageHandler 数据包处理接口,已经虚类 DataPackageHandlerBase 作为数据处理器基类已经内置了 粘包 分包 的逻辑,继承此类后专注自己处理的业务即可

+ +

此外我们还内置了 FixLengthDataPackageHandler 固定长度数据处理器 使用方法如下:

+ +
[Inject]
+[NotNull]
+private ITcpSocketFactory? TcpSocketFactory { get; set; }
+
+private async Task CreateClient()
+{
+    // 创建 ITcpSocketClient 实例
+    var client = TcpSocketFactory.GetOrCreate("localhost", 0);
+
+    // 设置 FixLengthDataPackageHandler 数据处理器处理数据定长 4 的数据
+    client.SetDataHandler(new FixLengthDataPackageHandler(4)
+    {
+        // 设置接收数据回调方法
+        ReceivedCallBack = buffer =>
+        {
+            // 内部自动处理粘包分包问题,这里参数 buffer 一定是定长为 4 的业务数据
+            receivedBuffer = buffer;
+            return Task.CompletedTask;
+        }
+    });
+
+    // 连接远端节点 连接成功后自动开始接收数据
+    var connected = await client.ConnectAsync("192.168.10.100", 6688);
+}
+
diff --git a/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor.cs new file mode 100644 index 00000000000..f323a74c7e9 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Samples/SocketFactories.razor.cs @@ -0,0 +1,14 @@ +// 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 + +namespace BootstrapBlazor.Server.Components.Samples; + +/// +/// ISocketFactory 服务说明文档 +/// +public partial class SocketFactories +{ + +} diff --git a/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs b/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs index f4d62ae880c..34ea45c5770 100644 --- a/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs +++ b/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs @@ -1577,6 +1577,11 @@ void AddServices(DemoMenuItem item) Url = "print-service" }, new() + { + Text = Localizer["TcpSocketFactory"], + Url = "socket-factory" + }, + new() { Text = Localizer["ThemeProvider"], Url = "theme-provider" diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index 39e527da9af..5fe051767ce 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -4951,7 +4951,8 @@ "AvatarUpload": "AvatarUpload", "CardUpload": "CardUpload", "DropUpload": "DropUpload", - "Vditor": "Vditor Markdown" + "Vditor": "Vditor Markdown", + "TcpSocketFactory": "ITcpSocketFactory" }, "BootstrapBlazor.Server.Components.Samples.Table.TablesHeader": { "TablesHeaderTitle": "Header grouping function", diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index cb6918b4637..a55f4451a53 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -4951,7 +4951,8 @@ "AvatarUpload": "头像上传组件 AvatarUpload", "CardUpload": "卡片上传组件 CardUpload", "DropUpload": "拖动上传组件 DropUpload", - "Vditor": "富文本框 Vditor Markdown" + "Vditor": "富文本框 Vditor Markdown", + "TcpSocketFactory": "TCP Socket 套接字服务 ITcpSocketFactory" }, "BootstrapBlazor.Server.Components.Samples.Table.TablesHeader": { "TablesHeaderTitle": "表头分组功能", diff --git a/src/BootstrapBlazor.Server/docs.json b/src/BootstrapBlazor.Server/docs.json index 118f42ad254..cd61dad5f3a 100644 --- a/src/BootstrapBlazor.Server/docs.json +++ b/src/BootstrapBlazor.Server/docs.json @@ -240,7 +240,8 @@ "audio-device": "AudioDevices", "fullscreen-button": "FullScreenButtons", "meet": "Meets", - "vditor": "Vditors" + "vditor": "Vditors", + "socket-factory": "SocketFactories" }, "video": { "table": "BV1ap4y1x7Qn?p=1",