Skip to content

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 - 清理协议和心跳对象

架构设计要点

  1. 职责分离:协议解析(cPacketProtocol)、心跳管理(cHeartbeat)独立成类,cWinsock 只负责组合调用
  2. 独立实例:每个 cWinsock 客户端持有独立的协议/心跳实例,多客户端互不干扰
  3. 配置继承:服务端 OnAccept 时新客户端自动继承协议和心跳配置
  4. 向后兼容:不设置协议时行为完全不变,DataArrival 事件照常触发
  5. 双事件模型:协议模式下同时触发 MessageArrival(完整消息)和 DataArrival(向后兼容)
  6. 自动心跳:cHeartbeat 内嵌 cTimer,Enabled=True 即自动运行,无需外部驱动

待完成

  • [ ] P2:性能优化(批量发送、数据压缩、连接池)
  • [ ] P3:高级功能(SSL/TLS、WebSocket、断线重连、限流控制)
  • [ ] 更新 docs/winsock 文档反映新增 API

VB6及其LOGO版权为微软公司所有