CommunicationAbstract 基类 - Snet Docs

🔌 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);

返回底层通信对象(如 TcpClientSerialPortClientWebSocketUdpClient),用于高级场景。

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 广播

参见