2025-05-25 cWinsock P0/P1 功能实现
变更概述
按照 roadmap 开发计划,分步实现了 P0(封包协议、心跳机制)和 P1(GetData 增强方法)功能。 遵循职责分离原则,将新增功能拆分到独立类文件中。
新增文件
cPacketProtocol.cls
- 数据封包协议处理器,解决 TCP 分包/粘包问题
- 支持三种内置协议:字符分隔符(ppDelimiter)、定长(ppFixedLength)、长度头(ppLengthHeader)
- 每个客户端对象持有独立协议实例,缓冲区相互隔离
- 提供
Encode(封包)和Decode(解包)统一接口 - Decode 返回 Collection,支持一次解析出多条完整消息
- 内部自动缓存分片数据,数据完整后才返回
cHeartbeat.cls
- TCP 智能心跳管理器
- 服务端:超时检测,轮询客户端 LastActivityTime,自动断开僵尸连接
- 客户端:周期性发送心跳包,智能跳过(有数据收发时跳过)
- 内嵌
cTimer自动驱动(10秒间隔),无需外部定时器或 PollHeartbeat() - 通过
Tick事件通知 cWinsock 执行心跳逻辑
修改文件
cWinSock.cls
新增事件:
MessageArrival(Client, bytesTotal)- 协议解析后的完整消息到达(仅 PacketProtocol 设置时触发)ClientTimeout(Client)- 服务端检测到客户端超时HeartbeatSent(Client)- 客户端心跳已发送
新增成员:
m_oPacketProtocol As cPacketProtocol- 协议处理器m_oHeartbeat As cHeartbeat- 心跳管理器(WithEvents,响应 Tick 事件)
新增属性:
PacketHandler/PacketProtocol/Delimiter/FixedLength/HeaderBytes/HeaderEndian- 协议配置AutoHeartbeat/HeartbeatTimeout/HeartbeatInterval/HeartbeatData/IdleSeconds- 心跳配置
新增方法:
GetDataText()/GetDataTextUTF8()/GetDataTextUnicode()- 返回值型文本获取GetDataHex()- 返回值型十六进制获取GetDataByteArray()- 返回值型字节数组获取→ 已移除,改用PollHeartbeat()m_oHeartbeat_Tick事件自动驱动
修改方法:
SendData- 当 PacketProtocol 设置时,自动调用 Encode 封包m_oSocket_OnReceive- 当 PacketProtocol 设置时,自动调用 Decode 解包,触发 MessageArrival 事件m_oSocket_OnSend- 重置心跳活动时间m_oSocket_OnAccept- 新客户端自动继承服务器的协议配置,创建独立协议实例Close_- 清理协议缓冲区和停止心跳Class_Terminate- 清理协议和心跳对象
架构设计要点
- 职责分离:协议解析(cPacketProtocol)、心跳管理(cHeartbeat)独立成类,cWinsock 只负责组合调用
- 独立实例:每个 cWinsock 客户端持有独立的协议/心跳实例,多客户端互不干扰
- 配置继承:服务端 OnAccept 时新客户端自动继承协议和心跳配置
- 向后兼容:不设置协议时行为完全不变,DataArrival 事件照常触发
- 双事件模型:协议模式下同时触发 MessageArrival(完整消息)和 DataArrival(向后兼容)
- 自动心跳:cHeartbeat 内嵌 cTimer,Enabled=True 即自动运行,无需外部驱动
待完成
- [ ] P2:性能优化(批量发送、数据压缩、连接池)
- [ ] P3:高级功能(SSL/TLS、WebSocket、断线重连、限流控制)
- [ ] 更新 docs/winsock 文档反映新增 API