Skip to content

Commit aceb9ae

Browse files
committed
doc: 更新手动接收示例
1 parent d86c04c commit aceb9ae

File tree

2 files changed

+25
-48
lines changed

2 files changed

+25
-48
lines changed

src/BootstrapBlazor.Server/Components/Samples/Sockets/ManualReceives.razor

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,21 @@
99
<DemoBlock Title="@Localizer["NormalTitle"]"
1010
Introduction="@Localizer["NormalIntro"]"
1111
Name="Normal" ShowCode="false">
12-
<p>本例中连接一个模拟时间同步服务,每间隔 10s 自动发送服务器时间戳,连接后无需发送任何数据即可持续收到时间戳数据</p>
12+
<p>本例中连接一个模拟时间同步服务,采用一发一收的方式进行通讯,连接后发送查询电文,接收到服务器端响应时间戳电文数据</p>
1313
<ul class="ul-demo">
1414
<li>点击 <b>连接</b> 按钮后通过 <code>ITcpSocketFactory</code> 服务实例创建的 <code>ITcpSocketClient</code> 对象连接到网站模拟 <code>TcpServer</code></li>
1515
<li>点击 <b>断开</b> 按钮调用 <code>CloseAsync</code> 方法断开 Socket 连接</li>
16+
<li>点击 <b>发送</b> 按钮调用 <code>SendAsync</code> 方法发送请求数据</li>
1617
</ul>
17-
<p>使用 <code>ReceivedCallBack</code> 委托获得接收到的数据,可通过 <code>+=</code> 方法支持多个客户端接收数据</p>
18-
<Pre>_client.ReceivedCallBack += OnReceivedAsync;</Pre>
19-
<p>特别注意页面需要继承 <code>IDisposable</code> 或者 <code>IAsyncDisposable</code> 接口,在 <code>Dispose</code> 或者 <code>DisposeAsync</code> 中移除委托</p>
20-
<Pre>private void Dispose(bool disposing)
21-
{
22-
if (disposing)
23-
{
24-
if (_client is { IsConnected: true })
25-
{
26-
_client.ReceivedCallBack -= OnReceivedAsync;
27-
}
28-
}
29-
}</Pre>
30-
18+
<p>使用 <code>ReceiveAsync</code> 方法主动接收数据</p>
3119
<div class="row form-inline g-3">
3220
<div class="col-12 col-sm-6">
3321
<Button Text="连接" Icon="fa-solid fa-play"
3422
OnClick="OnConnectAsync" IsDisabled="@_client.IsConnected"></Button>
3523
<Button Text="断开" Icon="fa-solid fa-stop" class="ms-2"
3624
OnClick="OnCloseAsync" IsDisabled="@(!_client.IsConnected)"></Button>
25+
<Button Text="发送" Icon="fa-solid fa-paper-plane" class="ms-2" IsAsync="true"
26+
OnClick="OnSendAsync" IsDisabled="@(!_client.IsConnected)"></Button>
3727
</div>
3828
<div class="col-12">
3929
<Console Items="@_items" Height="496" HeaderText="接收数据(间隔 10 秒)"

src/BootstrapBlazor.Server/Components/Samples/Sockets/ManualReceives.razor.cs

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace BootstrapBlazor.Server.Components.Samples.Sockets;
1010
/// <summary>
1111
/// 接收电文示例
1212
/// </summary>
13-
public partial class ManualReceives : IDisposable
13+
public partial class ManualReceives
1414
{
1515
[Inject, NotNull]
1616
private ITcpSocketFactory? TcpSocketFactory { get; set; }
@@ -19,7 +19,7 @@ public partial class ManualReceives : IDisposable
1919

2020
private List<ConsoleMessageItem> _items = [];
2121

22-
private readonly IPEndPoint _serverEndPoint = new(IPAddress.Loopback, 8800);
22+
private readonly IPEndPoint _serverEndPoint = new(IPAddress.Loopback, 8810);
2323

2424
/// <summary>
2525
/// <inheritdoc/>
@@ -29,11 +29,11 @@ protected override void OnInitialized()
2929
base.OnInitialized();
3030

3131
// 从服务中获取 Socket 实例
32-
_client = TcpSocketFactory.GetOrCreate("demo-receive", options =>
32+
_client = TcpSocketFactory.GetOrCreate("demo-manual-receive", options =>
3333
{
3434
options.LocalEndPoint = new IPEndPoint(IPAddress.Loopback, 0);
35+
options.IsAutoReceive = false;
3536
});
36-
_client.ReceivedCallBack += OnReceivedAsync;
3737
}
3838

3939
private async Task OnConnectAsync()
@@ -58,40 +58,27 @@ private Task OnClear()
5858
return Task.CompletedTask;
5959
}
6060

61-
private async ValueTask OnReceivedAsync(ReadOnlyMemory<byte> data)
61+
private async Task OnSendAsync()
6262
{
63-
// 将数据显示为十六进制字符串
64-
var payload = System.Text.Encoding.UTF8.GetString(data.Span);
65-
_items.Add(new ConsoleMessageItem
63+
if (_client is { IsConnected: true })
6664
{
67-
Message = $"接收到来自站点的数据为 {payload}"
68-
});
65+
// 准备通讯数据
66+
var data = new byte[12];
67+
var result = await _client.SendAsync(new byte[2] { 0x01, 0x02 }, CancellationToken.None);
68+
var state = result ? "成功" : "失败";
6969

70-
// 保持队列中最大数量为 50
71-
if (_items.Count > 50)
72-
{
73-
_items.RemoveAt(0);
74-
}
75-
await InvokeAsync(StateHasChanged);
76-
}
70+
// 记录日志
71+
_items.Add(new ConsoleMessageItem()
72+
{
73+
Message = $"{DateTime.Now}: 发送数据 {_client.LocalEndPoint} - {_serverEndPoint} Data {BitConverter.ToString(data)} {state}"
74+
});
7775

78-
private void Dispose(bool disposing)
79-
{
80-
if (disposing)
81-
{
82-
if (_client is { IsConnected: true })
76+
var buffer = await _client.ReceiveAsync(CancellationToken.None);
77+
_items.Add(new ConsoleMessageItem()
8378
{
84-
_client.ReceivedCallBack -= OnReceivedAsync;
85-
}
79+
Message = $"{DateTime.Now}: 接收数据 {_client.LocalEndPoint} - {_serverEndPoint} Data {BitConverter.ToString(buffer.ToArray())} 成功",
80+
Color = Color.Success
81+
});
8682
}
8783
}
88-
89-
/// <summary>
90-
/// <inheritdoc/>
91-
/// </summary>
92-
public void Dispose()
93-
{
94-
Dispose(true);
95-
GC.SuppressFinalize(this);
96-
}
9784
}

0 commit comments

Comments
 (0)