Skip to content

✨ 新增 WebSocket Client 通信协议 - #4

Merged
keeleycenc merged 2 commits into
mainfrom
feature/websocket
Jul 18, 2026
Merged

keeleycenc merged 2 commits into
mainfrom
feature/websocket

Conversation

@keeleycenc

Copy link
Copy Markdown
Collaborator

Pull Request 描述

提交前检查

  • 本地合并了最新的代码,解决了合并冲突
  • 已经检查了代码,并在必要的位置添加了相应的注释
  • 遵循了此项目的代码风格及规范
  • 代码构建干净,没有任何错误和警告
  • 已经添加单元测试(非必须)
  • 更新了相应的文档(非必须)

变更类型

  • 新功能

相关 Issue

无

目的

问题描述:

新增定位为通用传输层的 WebSocket Client 协议,复用统一的 IProtocol 生命周期与 IProtocolManager 实例管理,为 MES 网关等场景提供基础通信能力(消息序列化约定、请求-响应匹配、Topic 订阅、Token 刷新等应用层能力由调用方实现):

  • IWebSocketProtocol / IWebSocketCommunicationConfig:文本/二进制消息收发、MessageReceived/Closed/Reconnected 事件、自定义请求头(Bearer Token 等认证头)与 SubProtocol、仅接受 ws:///wss://
  • WebSocketProtocolClient(基于 BCL ClientWebSocket,无第三方依赖):后台接收循环(分片合并、超限以 MessageTooBig 关闭)、并发发送串行化、心跳保活与应答超时、异常断线自动重连、优雅关闭握手、幂等释放
  • Closed 事件以"原子摘除连接"为唯一发布点,保证每个连接恰好发布一次(含对端不确认关闭帧的超时场景)
  • 实例键 = 规范化 EndpointUrl(仅 scheme/host/默认端口,path/query 保留语义)+ SubProtocol + ConnectionIdentity;敏感请求头不入键,不同认证身份不会复用连接
  • ClientWebSocketConnection 适配层集中承载目标框架差异:net9+ 原生 Ping/Pong 应答超时、net8 TCP Keep-Alive 探测、net481 ArraySegment 兼容路径
  • 单元测试 33 个(实例复用、连接/取消/超时、收发/分片/并发、远端关闭/主动断开/自动重连、发送超时、大小限制、释放竞态等),基于 TcpListener + WebSocket.CreateFromStream 的本地测试服务器,不依赖公网与第三方组件

预期影响:

  • 纯新增协议,现有 MC / Modbus / S7 / OPC UA 调用方无需改动
  • CommProtocol 增加 WebSocket 枚举值;ProtocolManager.CreateProtocol 与 GetInstanceKey 增加对应分支
  • 程序集版本 1.1.0 -> 1.2.0

评估

性能影响:

  • 无共享路径改动;WebSocket 客户端每连接一个后台接收任务与固定大小接收缓冲区,发送经信号量串行化,无额外分配热点

兼容性问题:

  • 基础接口 ICommunicationConfig 未改动(Ip 字段保留但不参与 WebSocket 连接与实例键),对现有调用方完全向后兼容
  • net481 通过适配层使用 ArraySegment 重载,公共二进制接口统一为 byte[];KeepAliveTimeout 在 net481 无法在传输层按连接强制,文档已说明替代方案

额外信息

  • 测试中发现 Windows 回环 TCP 无可靠背压(loopback fast-path 无界缓冲),发送超时测试改为通过内部连接适配层注入可控阻塞实现,确定性验证且不占用大内存
  • 全量测试:56 通过 / 0 失败 / 28 跳过(需真实 PLC/OPC UA 设备的既有集成测试)

图片/截图

无 UI 更改


Copyright (c) MAS(厦门威光) Corporation. All rights reserved.

🤖 Generated with Claude Code

keeleycenc and others added 2 commits July 18, 2026 23:09
新增通用传输层定位的 WebSocket 客户端,复用统一的 IProtocol 生命周期与
IProtocolManager 实例管理:

- IWebSocketProtocol / IWebSocketCommunicationConfig:文本/二进制收发、
  Closed/Reconnected 事件、自定义请求头与 SubProtocol、ws/wss 校验
- WebSocketProtocolClient:后台接收循环(分片合并、大小限制)、并发发送
  串行化、心跳保活与应答超时、异常断线自动重连、优雅关闭;Closed 事件以
  原子摘除连接为唯一发布点,保证每个连接恰好发布一次
- ClientWebSocketConnection 适配层集中承载 TFM 差异:net9+ 原生
  Ping/Pong 应答超时、net8 TCP Keep-Alive 探测、net481 ArraySegment 路径
- 实例键 = 规范化 EndpointUrl(仅 scheme/host/默认端口)+ SubProtocol +
  ConnectionIdentity,敏感请求头不入键;不同认证身份不复用连接
- 单元测试 33 个,基于 TcpListener 的本地测试服务器,不依赖公网与第三方组件
- 更新发展路线、docs 协议页面与示例,版本号 1.1.0 -> 1.2.0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@keeleycenc
keeleycenc merged commit 2e76291 into main Jul 18, 2026
1 check passed
@keeleycenc
keeleycenc deleted the feature/websocket branch July 18, 2026 15:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant