🔌 CommunicationAbstract 基类
CommunicationAbstract<O, D> 是所有客户端通信传输实现的基类。它继承自 CoreUnify<O, D> 并实现 ICommunication。
public abstract class CommunicationAbstract<O, D> : CoreUnify<O, D>, ICommunication
where O : class
where D : class
定位
CommunicationAbstract 面向客户端主动连接场景(TCP 客户端、串口、WebSocket 客户端、UDP 单播/组播/广播),提供统一的连接/发送/接收生命周期。
6个抽象方法
每个客户端通信实现必须实现全部 6 个方法:
1. OnAsync — 建立连接
public abstract Task<OperateResult> OnAsync(CancellationToken token = default);
建立与远程端点的连接。TCP 客户端执行 Socket Connect;串口执行 Open;UDP 执行 Connect 或加入组播组。
2. OffAsync — 关闭连接
public abstract Task<OperateResult> OffAsync(bool hardClose = false, CancellationToken token = default);
关闭连接。hardClose = true 执行强制关闭(如 Socket.Abort),false 尝试优雅关闭。
3. SendAsync — 发送数据
public abstract Task<OperateResult> SendAsync(byte[] data, CancellationToken token = default);
向远程端点发送原始字节数据。适用于单向命令、通知或不需要响应的写入操作。
支持自动分包(MaxChunkSize)和按块重试(RetrySendCount)。
4. SendWaitAsync — 发送并等待响应
public abstract Task<OperateResult> SendWaitAsync(byte[] data, CancellationToken token);
命令-应答模式。暂停后台数据监控 → 发送数据 → 捕获首次应答 → 恢复监控。 适用于需要远程设备应答的查询-响应模式。
注意:
token参数无默认值(与其他方法不同),调用时必须显式传入。
5. GetBaseObjectAsync — 获取底层对象
public abstract Task<OperateResult> GetBaseObjectAsync(CancellationToken token = default);
返回底层通信对象(如 TcpClient、SerialPort、ClientWebSocket、UdpClient),用于高级场景。
6. GetStatusAsync — 连接状态
public abstract Task<OperateResult> GetStatusAsync(CancellationToken token = default);
返回当前连接状态。通常检查内部通信对象是否存在且已连接/已打开。
同步便捷方法
| 同步方法 | 委托的异步方法 |
|---|---|
On() |
OnAsync().GetAwaiter().GetResult() |
Off(bool hardClose = false) |
OffAsync(hardClose).GetAwaiter().GetResult() |
Send(byte[] data) |
SendAsync(data).GetAwaiter().GetResult() |
SendWait(byte[] data, CancellationToken token) |
SendWaitAsync(data, token).GetAwaiter().GetResult() |
GetBaseObject() |
GetBaseObjectAsync().GetAwaiter().GetResult() |
GetStatus() |
GetStatusAsync().GetAwaiter().GetResult() |
通用配置模式
所有 CommunicationAbstract 子类的配置遵循一致的模式,通过嵌套的 Basics 类完成:
| 通用配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
SN |
string |
自动 GUID | 唯一实例标识符 |
IpAddress |
string? |
"127.0.0.1" |
远程地址 |
Port |
int |
6688 |
远程端口 |
Timeout |
int |
1000 |
I/O 超时(毫秒) |
SendWaitInterval |
int |
5000 |
发送等待超时(毫秒) |
MaxChunkSize |
int |
261120 (255KB) |
每块最大字节数 |
RetrySendCount |
int |
5 |
每块重试次数 |
数据传输流程
应用程序代码
|
+-- OnDataEvent(订阅) <-- 来自传输层的接收数据
|
+-- SendAsync(data) -----------> 传输层 ------> 网络
|
+-- SendWaitAsync(data, token) -> 传输层 <=====> 网络
(停止监控 → 发送 → 读取 → 恢复监控)
自动重连
客户端传输(TCP、WebSocket、UDP 单播)支持 InterruptReconnection 自动重连:
- 指数退避:初始 500ms,最大 30 秒
- 连接断开时自动重试,无需应用层干预
- 串口、组播、广播不支持自动重连(无连接或无状态协议)
Dispose 行为
public override void Dispose()
{
Off(true); // 先硬关闭连接
base.Dispose(); // 从单例池中移除
}
public override async ValueTask DisposeAsync()
{
await OffAsync(true).ConfigureAwait(false);
await base.DisposeAsync().ConfigureAwait(false);
}
具体实现 (6 个)
| 类 | 命名空间 | 传输方式 | 特点 |
|---|---|---|---|
TcpClientOperate |
Snet.Core.communication.net.tcp.client |
TCP/IP | 断线重连、分包发送 |
SerialOperate |
Snet.Core.communication.serial |
RS-232/485 | DataReceived 事件监控、GetPortArray() 枚举串口 |
WsClientOperate |
Snet.Core.communication.net.ws.client |
WebSocket | ClientWebSocket、优雅关闭 |
UdpClientOperate |
Snet.Core.communication.net.udp.unicast.client |
UDP 单播 | 自动端口分配 |
UdpMulticastOperate |
Snet.Core.communication.net.udp.multicast |
UDP 组播 | JoinMulticastGroup、TTL 控制 |
UdpBroadcastOperate |
Snet.Core.communication.net.udp.broadcast |
UDP 广播 | EnableBroadcast |
使用示例
using Snet.Core.communication.net.tcp.client;
using static Snet.Core.communication.net.tcp.client.TcpClientData;
// 1. 配置
var config = new Basics
{
IpAddress = "192.168.1.100",
Port = 6688,
InterruptReconnection = true
};
// 2. 获取单例
var client = await TcpClientOperate.InstanceAsync(config);
// 3. 订阅接收事件
client.OnDataEvent += (sender, e) =>
{
if (e.Status && e.ResultData is byte[] data)
Console.WriteLine($"收到: {data.Length} 字节");
};
// 4. 连接
await client.OnAsync();
// 5. 发送(即发即忘)
await client.SendAsync(Encoding.UTF8.GetBytes("PING"));
// 6. 发送并等待响应
var cts = new CancellationTokenSource(5000);
var response = await client.SendWaitAsync(
Encoding.UTF8.GetBytes("READ_STATUS"),
cts.Token);
if (response.Status)
Console.WriteLine($"响应: {response.ResultData}");
// 7. 断开
await client.OffAsync();
继承链
CoreUnify<O, D> — 单例、事件、计时、日志、语言
└── CommunicationAbstract<O, D> — Send/SendWait(客户端通信)
├── TcpClientOperate — TCP 客户端
├── SerialOperate — 串口 RS-232/485
├── WsClientOperate — WebSocket 客户端
├── UdpClientOperate — UDP 单播客户端
├── UdpMulticastOperate — UDP 组播
└── UdpBroadcastOperate — UDP 广播
