整体架构概览

连接模块位于 core/connection/ 目录下,采用策略模式设计,通过 ConnectFuncInterface 统一接口抽象不同连接类型,由 ConnServerInit() 在初始化时注册各连接类型的实现到全局数组 g_connManager[CONNECT_TYPE_MAX] 中。

连接模块目录结构:
├── manager/          # 连接管理器(统一入口)
├── interface/        # 对外接口定义
├── common/           # 公共组件(socket、监听器、数据头转换)
├── br/               # BR连接
├── ble/              # BLE连接
├── tcp/              # TCP连接
├── wifi_direct_cpp/  # WiFi Direct (P2P/HML)连接
└── coap/             # CoAP连接

1. 连接管理器 (Connection Manager)

核心文件softbus_conn_manager.c / softbus_conn_manager.h

设计模式:策略模式 + 观察者模式

连接管理器是整个连接模块的统一入口和调度中心,核心设计如下:

1.1 连接类型路由
ConnectFuncInterface *g_connManager[CONNECT_TYPE_MAX] = { 0 };

全局数组 g_connManager 以 ConnectType 为索引,存储各连接类型的实现。支持的连接类型定义在 softbus_conn_interface.h

枚举值 类型 说明
CONNECT_TCP = 1 TCP WiFi局域网TCP连接
CONNECT_BR = 2 BR 蓝牙基础速率连接
CONNECT_BLE = 3 BLE 蓝牙低功耗连接
CONNECT_P2P = 4 P2P WiFi Direct P2P连接
CONNECT_P2P_REUSE = 5 P2P_REUSE P2P连接复用
CONNECT_BLE_DIRECT = 6 BLE_DIRECT BLE直连
CONNECT_HML = 7 HML 增强型P2P(HML)连接
1.2 ConnectFuncInterface 统一接口
typedef struct {
    int32_t (*ConnectDevice)(const ConnectOption *option, uint32_t requestId, const ConnectResult *result);
    int32_t (*PostBytes)(uint32_t connectionId, uint8_t *data, uint32_t len, int32_t pid, int32_t flag, int32_t module, int64_t seq);
    int32_t (*DisconnectDevice)(uint32_t connectionId);
    int32_t (*DisconnectDeviceNow)(const ConnectOption *option);
    int32_t (*GetConnectionInfo)(uint32_t connectionId, ConnectionInfo *info);
    int32_t (*StartLocalListening)(const LocalListenerInfo *info);
    int32_t (*StopLocalListening)(const LocalListenerInfo *info);
    bool (*CheckActiveConnection)(const ConnectOption *info, bool needOccupy);
    int32_t (*UpdateConnection)(uint32_t connectionId, UpdateOption *option);
    int32_t (*PreventConnection)(const ConnectOption *option, uint32_t time);
    int32_t (*ConfigPostLimit)(const LimitConfiguration *configuration);
} ConnectFuncInterface;

每种连接类型(BR/BLE/TCP)都实现此接口,管理器通过 connectionId 高16位标识连接类型进行路由分发:

#define CONNECT_TYPE_SHIFT 16
// connectionId = (ConnectType << 16) | 序号
1.3 监听器管理(观察者模式)
typedef struct TagConnListenerNode {
    ListNode node;
    ConnModule moduleId;
    ConnectCallback callback;
} ConnListenerNode;

各业务模块(认证、通道、代理等)通过 ConnSetConnectCallback() 注册回调,管理器维护 g_listenerList 链表。当连接事件发生时,遍历所有监听器通知:

  • ConnManagerConnected() — 连接建立通知
  • ConnManagerReusedConnected() — 连接复用通知
  • ConnManagerDisconnected() — 连接断开通知
  • ConnManagerRecvData() — 数据接收分发(按 moduleId 路由到对应监听器)
1.4 初始化流程
int32_t ConnServerInit(void) {
    ConnSocketsAndBaseListenerInit();  // 初始化Socket和基础监听器
    g_connManager[CONNECT_TCP] = ConnInitTcp(&g_connManagerCb);   // TCP
    g_connManager[CONNECT_BR]  = ConnInitBr(&g_connManagerCb);    // BR
    g_connManager[CONNECT_BLE] = ConnInitBle(&g_connManagerCb);   // BLE
    // 创建监听器链表
    g_listenerList = CreateSoftBusList();
}
1.5 流量控制

softbus_conn_flow_control.h 实现了滑动窗口控制器

struct ConnSlideWindowController {
    int32_t (*apply)(struct ConnSlideWindowController *self, int32_t expect);
    int32_t (*enable)(struct ConnSlideWindowController *self, int32_t windowInMillis, int32_t quotaInBytes);
    int32_t (*disable)(struct ConnSlideWindowController *self);
    bool active;
    int32_t windowInMillis;   // 时间窗口(100ms~2s)
    int32_t quotaInBytes;     // 字节配额(10KB~2MB)
    ListNode histories;
};
1.6 数据包协议头
#define MAGIC_NUMBER 0xBABEFACE
typedef struct {
    int32_t magic;    // 魔数 0xBABEFACE
    int32_t module;   // 业务模块ID
    int64_t seq;      // 序列号
    int32_t flag;     // 优先级标志
    uint32_t len;     // 数据长度
} __attribute__((packed)) ConnPktHead;

2. BR连接 (Bluetooth Basic Rate)

核心文件br/

架构分层

br/
├── softbus_conn_br_manager.c/h     # BR连接管理器(状态机调度)
├── softbus_conn_br_connection.c/h  # BR连接实例(底层SPP操作)
├── softbus_conn_br_trans.c/h       # BR数据传输(拥塞控制、ACK机制)
├── softbus_conn_br_send_queue.c/h  # BR发送队列
├── softbus_conn_br_pending_packet.c/h  # BR待处理包管理
├── softbus_conn_br_snapshot.c/h    # BR快照(DFX诊断)
└── softbus_conn_br_hidumper.c/h    # BR堆栈信息转储

2.1 状态机模型

BR管理器采用有限状态机驱动,定义在 softbus_conn_br_manager.h

typedef struct {
    char *(*name)(void);
    void (*enter)(void);
    void (*exit)(void);
    void (*connectRequest)(const ConnBrConnectRequestContext *ctx);
    void (*handlePendingRequest)(void);
    void (*serverAccepted)(uint32_t connectionId);
    void (*clientConnected)(uint32_t connectionId);
    void (*clientConnectFailed)(uint32_t connectionId, int32_t error);
    void (*clientConnectTimeout)(uint32_t connectionId, const char *address);
    void (*dataReceived)(ConnBrDataReceivedContext *ctx);
    void (*connectionException)(uint32_t connectionId, int32_t error);
    void (*connectionResume)(uint32_t connectionId);
    void (*disconnectRequest)(uint32_t connectionId);
    void (*unpend)(const char *addr);
    void (*reset)(int32_t reason);
} ConnBrState;

两个核心状态:

  • BR_STATE_AVAILABLE — 空闲,可接受新连接请求
  • BR_STATE_CONNECTING — 正在连接中,新请求进入等待队列

设备状态:

enum ConnBrDeviceState {
    BR_DEVICE_STATE_INIT,
    BR_DEVICE_STATE_WAIT_EVENT,
    BR_DEVICE_STATE_PENDING,
    BR_DEVICE_STATE_WAIT_SCHEDULE,
    BR_DEVICE_STATE_SCHEDULING,
};

2.2 连接实例

typedef struct {
    uint32_t connectionId;
    ConnSideType side;          // CLIENT / SERVER
    char addr[BT_MAC_LEN];     // 蓝牙MAC地址
    uint32_t mtu;              // 最大传输单元(3KB)
    int32_t socketHandle;      // SPP socket句柄
    enum ConnBrConnectionState state;
    int32_t connectionRc;      // 业务引用计数
    int32_t objectRc;          // 对象引用计数
    // 拥塞控制
    int32_t window;            // 滑动窗口大小
    int64_t sequence;          // 发送序列号
    int64_t waitSequence;      // 等待ACK的序列号
    int32_t ackTimeoutCount;   // ACK超时计数
} ConnBrConnection;

连接状态生命周期:

CONNECTING → CONNECTED → EXCEPTION → NEGOTIATION_CLOSING → CLOSING → CLOSED

2.3 数据传输与拥塞控制

BR传输实现了基于ACK的滑动窗口拥塞控制

enum BrCtlMessageMethod {
    BR_METHOD_NOTIFY_REQUEST = 1,   // 请求引用通知
    BR_METHOD_NOTIFY_RESPONSE = 2,  // 引用通知响应
    BR_METHOD_NOTIFY_ACK = 4,       // ACK确认
    BR_METHOD_ACK_RESPONSE = 5,     // ACK响应
};

// 窗口参数
#define MIN_WINDOW     10
#define MAX_WINDOW     80
#define DEFAULT_WINDOW 20
#define ACK_FAILED_TIMES       3     // ACK失败3次触发异常
#define WAIT_ACK_TIMEOUT_MILLS 100   // ACK超时100ms

2.4 ACL碰撞处理

BR连接有ACL碰撞检测与避让机制

  • BR_CONNECTION_ACL_RETRY_CONNECT_COLLISION_MILLIS = 3s — 碰撞后重试等待
  • BR_CONNECTION_ACL_CONNECT_COLLISION_MILLIS = 6s — ACL碰撞等待
  • BR_CONNECT_TIMEOUT_MIN_MILLIS = 10s / MAX = 20s — 连接超时范围

2.5 消息驱动

BR管理器使用 SoftBusHandlerWrapper 消息循环机制:

enum BrMgrLooperMsg {
    MSG_NEXT_CMD, MSG_CONNECT_REQUEST, MSG_CONNECT_SUCCESS,
    MSG_CONNECT_TIMEOUT, MSG_CONNECT_FAIL, MSG_SERVER_ACCEPTED,
    MSG_DATA_RECEIVED, MSG_CONNECTION_EXECEPTION, MSG_CONNECTION_RESUME,
    MGR_DISCONNECT_REQUEST, MSG_UNPEND, MSG_RESET,
};

3. BLE连接 (Bluetooth Low Energy)

核心文件ble/

架构分层

ble/
├── softbus_conn_ble_manager.c/h       # BLE连接管理器(状态机调度)
├── softbus_conn_ble_connection.c/h    # BLE连接实例
├── softbus_conn_ble_client.c/h        # GATT客户端
├── softbus_conn_ble_server.c/h        # GATT服务端
├── softbus_conn_ble_trans.c/h         # BLE数据传输
├── softbus_conn_ble_send_queue.c/h    # BLE发送队列
├── softbus_conn_ble_snapshot.c/h      # BLE快照
├── softbus_conn_ble_hidumper.c/h      # BLE堆栈转储
├── softbus_conn_ble_direct_virtual.c  # BLE Direct虚拟实现
├── ble_protocol_interface_factory.c/h # BLE协议接口工厂
└── softbus_conn_coc_virtual.c         # CoC(CoC)虚拟实现

3.1 GATT服务架构

BLE连接基于GATT (Generic Attribute Profile) 协议,定义了专用UUID:

#define SOFTBUS_SERVICE_UUID              "11C8B310-80E4-4276-AFC0-F81590B2177F"
#define SOFTBUS_CHARA_BLENET_UUID         "00002B00-0000-1000-8000-00805F9B34FB"  // 网络控制特征
#define SOFTBUS_CHARA_BLECONN_UUID        "00002B01-0000-1000-8000-00805F9B34FB"  // 连接数据特征
#define SOFTBUS_DESCRIPTOR_CONFIGURE_UUID "00002902-0000-1000-8000-00805F9B34FB"  // 描述符配置

双特征通道设计

  • BLENET特征 (0x2B00) — 网络控制消息(引用请求/响应、基本信息交换)
  • BLECONN特征 (0x2B01) — 业务数据传输

3.2 连接状态机

BLE连接状态比BR更复杂,因为GATT连接需要服务发现、特征通知订阅、MTU协商等步骤:

enum ConnBleConnectionState {
    BLE_CONNECTION_STATE_CONNECTING = 0,    // 客户端发起连接
    BLE_CONNECTION_STATE_CONNECTED,         // 服务端已接受
    BLE_CONNECTION_STATE_SERVICE_SEARCHING, // 服务发现中
    BLE_CONNECTION_STATE_SERVICE_SEARCHED,  // 服务发现完成
    BLE_CONNECTION_STATE_CONN_NOTIFICATING, // CONN特征通知订阅中
    BLE_CONNECTION_STATE_CONN_NOTIFICATED,  // CONN特征通知已订阅
    BLE_CONNECTION_STATE_NET_NOTIFICATING,  // NET特征通知订阅中
    BLE_CONNECTION_STATE_NET_NOTIFICATED,   // NET特征通知已订阅
    BLE_CONNECTION_STATE_MTU_SETTING,       // MTU协商中
    BLE_CONNECTION_STATE_MTU_SETTED,        // MTU协商完成
    BLE_CONNECTION_STATE_EXCHANGING_BASIC_INFO, // 基本信息交换中
    BLE_CONNECTION_STATE_EXCHANGED_BASIC_INFO,  // 基本信息交换完成
    BLE_CONNECTION_STATE_NEGOTIATION_CLOSING,   // 协商关闭中
    BLE_CONNECTION_STATE_CLOSING,               // 关闭中
    BLE_CONNECTION_STATE_CLOSED,                // 已关闭
};

3.3 统一协议接口

typedef struct {
    int32_t (*bleClientConnect)(ConnBleConnection *connection);
    int32_t (*bleClientDisconnect)(ConnBleConnection *connection, bool grace, bool refreshGatt);
    int32_t (*bleClientSend)(ConnBleConnection *connection, const uint8_t *data, uint32_t dataLen, int32_t module);
    int32_t (*bleClientUpdatePriority)(ConnBleConnection *connection, ConnectBlePriority priority);
    int32_t (*bleServerStartService)(void);
    int32_t (*bleServerStopService)(void);
    int32_t (*bleServerSend)(ConnBleConnection *connection, const uint8_t *data, uint32_t dataLen, int32_t module);
    int32_t (*bleServerConnect)(ConnBleConnection *connection);
    int32_t (*bleServerDisconnect)(ConnBleConnection *connection);
    int32_t (*bleClientInitModule)(SoftBusLooper *looper, const ConnBleClientEventListener *listener);
    int32_t (*bleServerInitModule)(SoftBusLooper *looper, const ConnBleServerEventListener *listener);
} BleUnifyInterface;

通过 ble_protocol_interface_factory 工厂模式,支持 GATT 和 CoC (Connection Oriented Channel) 两种底层协议。

3.4 BLE连接实例

typedef struct {
    BleProtocolType protocol;     // GATT / CoC
    uint32_t connectionId;
    ConnSideType side;
    bool fastestConnectEnable;    // 快速连接模式
    char addr[BT_MAC_LEN];
    uint32_t psm;                 // CoC的PSM
    ConnBleReadBuffer buffer;     // 数据分片重组缓冲区
    int32_t underlayerHandle;     // 底层GATT/CoC句柄
    uint32_t mtu;                 // MTU大小(默认512)
    char udid[UDID_BUF_LEN];     // 设备唯一标识
    char networkId[NETWORK_ID_BUF_LEN];
    ConnBleFeatureBitSet featureBitSet;  // 特性位集
    int32_t connectionRc;         // 业务引用计数
    int32_t objectRc;             // 对象引用计数
} ConnBleConnection;

3.5 BLE管理器状态机

enum BleMgrState {
    BLE_MGR_STATE_AVAILABLE,   // 空闲
    BLE_MGR_STATE_CONNECTING,  // 连接中
};

enum ConnBleDeviceState {
    BLE_DEVICE_STATE_INIT,
    BLE_DEVICE_STATE_WAIT_EVENT,
    BLE_DEVICE_STATE_WAIT_SCHEDULE,
    BLE_DEVICE_STATE_SCHEDULING,
};

3.6 关键特性

  • 快速连接模式 (fastestConnectEnable): 底层超时设为3.5秒
  • 连接复用: 通过UDID查找已有连接进行复用
  • KeepAlive机制: 防止空闲连接被断开(超时10秒)
  • 重试机制: GATT连接最大重试2次
  • 空闲超时断开: 60秒无数据自动断开
  • 防连接冲突BlePrevent 机制防止短时间内重复连接

3.7 数据分片重组

BLE由于MTU限制(默认512字节),需要分片传输:

typedef struct {
    uint32_t seq;       // 分片序列号
    uint32_t size;      // 当前分片大小
    uint32_t offset;    // 偏移量
    uint32_t total;     // 总大小
} BleTransHeader;

4. TCP连接

核心文件tcp/

架构

tcp/
├── softbus_tcp_connect_manager.c/h  # TCP连接管理器
└── softbus_tcp_connect_virtual.c    # 虚拟实现

4.1 连接管理

TCP连接管理器维护连接信息链表:

typedef struct TcpConnInfoNode {
    ListNode node;
    uint32_t connectionId;
    ConnectResult result;
    uint32_t requestId;
    ConnectStatistics statistics;
    ConnectionInfo info;
} TcpConnInfoNode;

static SoftBusList *g_tcpConnInfoList = NULL;

4.2 核心接口

int32_t TcpConnectDevice(const ConnectOption *option, uint32_t requestId, const ConnectResult *result);
int32_t TcpDisconnectDevice(uint32_t connectionId);
int32_t TcpDisconnectDeviceNow(const ConnectOption *option);
int32_t TcpPostBytes(uint32_t connectionId, uint8_t *data, uint32_t len, int32_t pid, int32_t flag, int32_t module, int64_t seq);
int32_t TcpGetConnectionInfo(uint32_t connectionId, ConnectionInfo *Info);
int32_t TcpStartListening(const LocalListenerInfo *info);
int32_t TcpStopListening(const LocalListenerInfo *info);

4.3 连接ID计算

uint32_t CalTcpConnectionId(int32_t fd) {
    // fd作为低16位,CONNECT_TCP作为高16位
    return ((uint32_t)CONNECT_TCP << CONNECT_TYPE_SHIFT) | (uint32_t)fd;
}

4.4 事件驱动

TCP连接基于 SoftbusBaseListener 事件驱动模型:

static int32_t TcpOnConnectEvent(ListenerModule module, int32_t cfd, const ConnectOption *clientAddr);
static int32_t TcpOnDataEvent(ListenerModule module, int32_t events, int32_t fd);
  • TcpOnConnectEvent — 处理新连接接入
  • TcpOnDataEvent — 处理数据到达事件

4.5 KeepAlive机制

#define AUTH_P2P_KEEP_ALIVE_TIME      10   // 保活时间(秒)
#define AUTH_P2P_KEEP_ALIVE_INTERVAL  2    // 保活间隔(秒)
#define AUTH_P2P_KEEP_ALIVE_COUNT     5    // 保活探测次数

4.6 公共组件支撑

TCP依赖 common/ 模块:

  • softbus_base_listener.c — 基础监听器(epoll/select事件驱动)
  • softbus_socket.c — Socket操作封装
  • softbus_tcp_socket.c — TCP Socket专用操作
  • softbus_datahead_transform.c — 数据包头字节序转换
  • softbus_epoll_event_implement.c — epoll事件实现
  • softbus_select_event_implement.c — select事件实现

5. WiFi Direct (P2P) 连接

核心文件wifi_direct_cpp/

这是连接模块中最复杂的子系统,采用C++实现,基于命令-执行器-处理器架构。

架构分层

wifi_direct_cpp/
├── command/          # 命令层(ConnectCommand, DisconnectCommand, NegotiateCommand等)
├── processor/        # 处理器层(P2pV1Processor, NullProcessor)
├── entity/           # 实体层(P2pEntity状态机)
├── channel/          # 协商通道(Auth/Proxy/Dummy NegotiateChannel)
├── data/             # 数据层(LinkManager, InterfaceManager, NegotiateMessage等)
├── event/            # 事件系统(EventDispatcher, EventQueue)
├── protocol/         # 协议层(JSON/TLV协议)
├── adapter/          # 适配层(P2P适配器)
├── dfx/              # 诊断(DFX快照、打点、HiDump)
└── utils/            # 工具类

5.1 连接类型

enum WifiDirectConnectType {
    WIFI_DIRECT_CONNECT_TYPE_AUTH_NEGO_P2P = 0,    // 认证协商P2P
    WIFI_DIRECT_CONNECT_TYPE_AUTH_NEGO_HML = 1,    // 认证协商HML
    WIFI_DIRECT_CONNECT_TYPE_BLE_TRIGGER_HML = 2,  // BLE触发HML
    WIFI_DIRECT_CONNECT_TYPE_AUTH_TRIGGER_HML = 3, // 认证触发HML
    WIFI_DIRECT_CONNECT_TYPE_ACTION_TRIGGER_HML = 4, // Action触发HML
};

5.2 角色模型

enum WifiDirectRole {
    WIFI_DIRECT_ROLE_AUTO = 1,      // 自动选择
    WIFI_DIRECT_ROLE_GO = 2,        // Group Owner
    WIFI_DIRECT_ROLE_GC = 3,        // Group Client
    WIFI_DIRECT_ROLE_BRIDGE_GC = 4, // 桥接GC
    WIFI_DIRECT_ROLE_NONE = 5,      // 无角色
    WIFI_DIRECT_ROLE_HML = 6,       // HML角色
};

5.3 P2P实体状态机

P2pEntity 是P2P连接的核心实体,采用状态模式

P2pEntity状态:
├── P2pAvailableState     → 可用状态,可创建/加入组
├── P2pConnectState       → 连接中状态
├── P2pCreateGroupState   → 创建组中状态
├── P2pDestroyGroupState  → 销毁组中状态
└── P2pUnavailableState   → 不可用状态

状态转换由P2P系统事件驱动:

  • OnP2pStateChangeEvent — P2P开关状态变化
  • OnP2pConnectionChangeEvent — P2P连接状态变化

5.4 命令-执行器-处理器架构

命令:

  • ConnectCommand — 连接命令
  • DisconnectCommand — 断开命令
  • ForceDisconnectCommand — 强制断开命令
  • NegotiateCommand — 协商命令

执行器:

  • 每个远程设备对应一个 WifiDirectExecutor
  • Executor运行在独立线程中
  • 绑定一个 WifiDirectProcessor 处理具体逻辑

处理器:

  • P2pV1Processor — P2P V1版本处理器
  • NullProcessor — 空处理器

5.5 协商通道

// 三种协商通道:
AuthNegotiateChannel   → 基于认证通道的协商
ProxyNegotiateChannel  → 基于代理通道的协商
DummyNegotiateChannel  → 虚拟协商通道

5.6 链路类型

enum WifiDirectLinkType {
    WIFI_DIRECT_LINK_TYPE_P2P,   // 标准P2P链路
    WIFI_DIRECT_LINK_TYPE_HML,   // HML(High Molecular Link)增强链路
};

HML是增强型P2P连接,支持接口名 chba0,IP前缀 172.30.

5.7 数据管理

  • LinkManager — 管理所有WiFi Direct链路
  • InterfaceManager — 管理网络接口(p2p0/chba0/wlan0)
  • InterfaceInfo — 接口信息(IP、角色、带宽等)
  • InnerLink — 内部链路抽象
  • NegotiateMessage — 协商消息(JSON/TLV序列化)

5.8 协议层

// 两种序列化协议:
JsonProtocol  → JSON格式协商消息
TlvProtocol   → TLV格式协商消息

通过 WifiDirectProtocolFactory 工厂创建。


6. CoAP连接

核心文件coap/

当前实现状态

CoAP连接在开源版本中是虚拟实现(stub),实际实现在增强包中:

// conn_coap_manager_virtual.c (开源版本)
int32_t ConnCoapStartServerListen(void) {
    return SOFTBUS_FUNC_NOT_SUPPORT;  // 返回不支持
}

void ConnCoapStopServerListen(void) {
    return;
}

构建配置

从 conn.gni 可以看到,CoAP的实际实现在增强包路径:

if (dsoftbus_feature_ex_kits) {
    import("$dsoftbus_root_path/dsoftbus_enhance/core/connection/coap/conn_coap.gni")
    conn_manager_inc += conn_coap_inc
    conn_manager_src += conn_coap_src
} else {
    # 开源版本使用虚拟实现
    conn_manager_src += [
        "$dsoftbus_root_path/core/connection/coap/src/conn_coap_manager_virtual.c",
    ]
}

CoAP定位

CoAP (Constrained Application Protocol) 在分布式软总线中主要用于设备发现阶段的轻量级通信,而非数据传输通道。它不注册到 g_connManager 数组中,而是作为独立的服务存在。

连接选择策略

不同连接类型适用于不同场景:

连接类型 带宽 延迟 功耗 适用场景
BR 中(3KB MTU) 蓝牙数据传输、无WiFi场景
BLE 低(512B MTU) 设备发现、小数据传输、保活
TCP WiFi局域网大数据传输
P2P 高速直连通道
HML 增强型P2P高速通道
CoAP 极低 极低 设备发现阶段轻量通信

引用计数机制

BR和BLE连接都采用双引用计数设计:

  • connectionRc — 业务引用计数,记录业务使用次数,为0时触发断连
  • objectRc — 对象引用计数,用于内存管理,为0时释放对象

通过 NotifyRequest/NotifyResponse 控制消息协商引用增减,实现连接复用

更多推荐