33// See the LICENSE file in the project root for more information.
44// Maintainer: Argo Zhang([email protected] ) Website: https://www.blazor.zone 55
6+ using BootstrapBlazor . Server . Components . Components ;
67using System . Net ;
8+ using System . Text ;
79
810namespace BootstrapBlazor . Server . Components . Samples . Sockets ;
911
@@ -21,8 +23,9 @@ public partial class Adapters : IDisposable
2123
2224 private readonly IPEndPoint _serverEndPoint = new ( IPAddress . Loopback , 8900 ) ;
2325
24- private CancellationTokenSource _connectTokenSource = new ( ) ;
25- private CancellationTokenSource _sendTokenSource = new ( ) ;
26+ private readonly CancellationTokenSource _connectTokenSource = new ( ) ;
27+ private readonly CancellationTokenSource _sendTokenSource = new ( ) ;
28+ private readonly CancellationTokenSource _receiveTokenSource = new ( ) ;
2629
2730 /// <summary>
2831 /// <inheritdoc/>
@@ -31,10 +34,12 @@ protected override void OnInitialized()
3134 {
3235 base . OnInitialized ( ) ;
3336
34- // 从服务中获取 Socket 实例
37+ // 从服务中获取 ITcpSocketClient 实例
3538 _client = TcpSocketFactory . GetOrCreate ( "demo-adapter" , options =>
3639 {
40+ // 关闭自动接收功能
3741 options . IsAutoReceive = false ;
42+ // 设置本地使用的 IP地址与端口
3843 options . LocalEndPoint = new IPEndPoint ( IPAddress . Loopback , 0 ) ;
3944 } ) ;
4045 }
@@ -44,16 +49,41 @@ private async Task OnConnectAsync()
4449 if ( _client is { IsConnected : false } )
4550 {
4651 await _client . ConnectAsync ( _serverEndPoint , _connectTokenSource . Token ) ;
52+ var state = _client . IsConnected ? "成功" : "失败" ;
53+ _items . Add ( new ConsoleMessageItem ( )
54+ {
55+ Message = $ "{ DateTime . Now } : 连接 { _client . LocalEndPoint } - { _serverEndPoint } { state } ",
56+ Color = _client . IsConnected ? Color . Success : Color . Danger
57+ } ) ;
4758 }
4859 }
4960
50- private async Task SendAsync ( )
61+ private async Task OnSendAsync ( )
5162 {
52- if ( _client is { IsConnected : false } )
63+ if ( _client is { IsConnected : true } )
5364 {
5465 // 准备通讯数据
55- var data = new byte [ 1024 ] ;
56- await _client . SendAsync ( data , _sendTokenSource . Token ) ;
66+ var data = new byte [ 12 ] ;
67+ "2025"u8 . CopyTo ( data ) ;
68+ Encoding . UTF8 . GetBytes ( DateTime . Now . ToString ( "ddHHmmss" ) ) . CopyTo ( data , 4 ) ;
69+ var result = await _client . SendAsync ( data , _sendTokenSource . Token ) ;
70+ if ( result )
71+ {
72+ // 发送成功
73+ var payload = await _client . ReceiveAsync ( _receiveTokenSource . Token ) ;
74+ if ( ! payload . IsEmpty )
75+ {
76+ // 解析接收到的数据
77+ // 响应头: 4 字节表示响应体长度 [0x32, 0x30, 0x32, 0x35]
78+ // 响应体: 8 字节当前时间戳字符串
79+ data = payload . ToArray ( ) ;
80+ var body = BitConverter . ToString ( data ) ;
81+ _items . Add ( new ConsoleMessageItem ( )
82+ {
83+ Message = $ "{ DateTime . Now } : 接收到来自 { _serverEndPoint } 数据: { Encoding . UTF8 . GetString ( data ) } HEX: { body } "
84+ } ) ;
85+ }
86+ }
5787 }
5888 }
5989
@@ -62,6 +92,12 @@ private async Task OnCloseAsync()
6292 if ( _client is { IsConnected : true } )
6393 {
6494 await _client . CloseAsync ( ) ;
95+ var state = _client . IsConnected ? "失败" : "成功" ;
96+ _items . Add ( new ConsoleMessageItem ( )
97+ {
98+ Message = $ "{ DateTime . Now } : 关闭 { _client . LocalEndPoint } - { _serverEndPoint } { state } ",
99+ Color = _client . IsConnected ? Color . Danger : Color . Success
100+ } ) ;
65101 }
66102 }
67103
@@ -71,31 +107,21 @@ private Task OnClear()
71107 return Task . CompletedTask ;
72108 }
73109
74- private async ValueTask OnReceivedAsync ( ReadOnlyMemory < byte > data )
75- {
76- // 将数据显示为十六进制字符串
77- var payload = System . Text . Encoding . UTF8 . GetString ( data . Span ) ;
78- _items . Add ( new ConsoleMessageItem
79- {
80- Message = $ "接收到来自站点的数据为 { payload } "
81- } ) ;
82-
83- // 保持队列中最大数量为 50
84- if ( _items . Count > 50 )
85- {
86- _items . RemoveAt ( 0 ) ;
87- }
88- await InvokeAsync ( StateHasChanged ) ;
89- }
90-
91110 private void Dispose ( bool disposing )
92111 {
93112 if ( disposing )
94113 {
95- if ( _client is { IsConnected : true } )
96- {
114+ // 释放连接令牌资源
115+ _connectTokenSource . Cancel ( ) ;
116+ _connectTokenSource . Dispose ( ) ;
97117
98- }
118+ // 释放发送令牌资源
119+ _sendTokenSource . Cancel ( ) ;
120+ _sendTokenSource . Dispose ( ) ;
121+
122+ // 释放接收令牌资源
123+ _receiveTokenSource . Cancel ( ) ;
124+ _receiveTokenSource . Dispose ( ) ;
99125 }
100126 }
101127
0 commit comments