YxdIOCP:Delphi/Pascal 下的一套高性能 IOCP 网络通讯框架
在 Delphi/Pascal 生态里,做高性能网络服务端一直是件“说起来简单、做起来头疼”的事情。要么依赖第三方 C 库,要么自己啃 Windows 的 IOCP API,还得操心粘包、内存池、连接管理、线程安全一堆细节。YxdIOCP 就是作者 yangyxd 为了让 Pascal 开发者能“开箱即用”地写高并发网络服务而做的一套纯 Pascal 实现的 IOCP 框架,源码量不大但五脏俱全,很适合拿来做即时通讯、推送网关、自定义协议服务端这类场景。
一、它是什么
YxdIOCP 是一套基于 Windows IOCP(I/O Completion Port,I/O 完成端口) 模型的网络通讯封装库,全部用 Object Pascal 编写,可在 Delphi(以及兼容的 Free Pascal 环境)下直接编译使用。
它把 IOCP 的底层复杂性封装起来,向上暴露一套相对友好、事件驱动的接口,让你专注于“收到数据后干什么”,而不是“怎么收数据”。
核心定位:
- 纯 Pascal 实现,无外部 DLL 依赖,编译即用;
- 单端口/多端口监听、海量连接的管理;
- 内置 数据收发缓冲区管理与粘包处理的基础设施;
- 提供 TCP 服务端 + 客户端两端的封装;
- 面向 长连接、高并发 的服务端场景优化。
二、IOCP 背景一句话
IOCP 是 Windows 上做高性能服务端的“正统”方案:一个或多个工作线程阻塞在完成端口上等待事件,IO 完成后系统把完成包投递出来,线程取出来处理即可。它天然支持大量并发连接,避免了传统 select 模型的性能瓶颈和“一连接一线程”的资源浪费。
YxdIOCP 的价值就在于:把这套模型连同缓冲区、连接对象、粘包等配套工程,一起用 Pascal 打包好了。
三、主要特性
从项目结构和使用方式看,YxdIOCP 提供了以下能力:
IOCP 通讯核心
- 完成端口封装、工作线程调度、Socket 上下文管理;
- 连接接入、断开、数据到达等事件的统一回调。
服务端(Server)封装
- 监听指定端口,接受连接;
- 以事件方式通知上层“某连接收到数据 / 连接建立 / 连接关闭”。
客户端(Client)封装
- 主动连接服务端,同样以事件回调方式收发数据。
缓冲区与打包/解包
- 内置接收缓冲管理,配合
PackSize/ 定长或长度前缀协议做粘包/半包处理; - 上层可以按“完整消息”处理,无需自己拼包。
- 内置接收缓冲管理,配合
连接管理与上下文
- 每个连接可绑定业务上下文(Context),方便存放用户态数据;
- 提供连接的发送、断开等操作接口。
线程安全的消息投递
- 跨线程发送数据时会做串行化处理,避免多线程直接操作同一 Socket 引发问题。
四、整体设计思路
YxdIOCP 的设计可以粗略拆成三层:
┌─────────────────────────────────────────┐ │ 业务层(你写的代码) │ │ OnRecv / OnConnect / OnDisconnect ... │ ├─────────────────────────────────────────┤ │ 框架层:TIOCPServer / TIOCPClient │ │ 连接管理、缓冲区、粘包、事件分发 │ ├─────────────────────────────────────────┤ │ 核心层:IOCP + Winsock 封装 │ │ CreateIoCompletionPort / WSARecv / ... │ └─────────────────────────────────────────┘
- 核心层负责和 Windows API 打交道:创建完成端口、投递
WSARecv、处理完成包。 - 框架层把“连接”抽象成对象,维护每个连接的收发缓冲区,处理数据到达后的拼接与切包,并把“干净”的数据回调给业务层。
- 业务层只需要重写/挂接几个事件方法,比如收到一条完整消息后做什么。
这种分层的好处是:你不需要理解 IOCP 的每一个细节,也能写出性能不错的服务端;而当你有特殊需求时,又可以直接下沉到框架层的缓冲区或核心层做改造。
五、典型使用流程
一个最小的服务端骨架大致是这样(伪代码,具体命名参考仓库示例):
uses
YxdIOCP.Server; // 具体单元名以仓库为准
type
TMyServer = class(TIOCPServer)
protected
procedure OnClientConnect(AContext: Pointer);
procedure OnClientRecv(AContext: Pointer; const Data; Len: Integer);
procedure OnClientDisconnect(AContext: Pointer);
end;
procedure TMyServer.OnClientConnect(AContext: Pointer);
begin
// 新连接建立,可在此登记用户信息
end;
procedure TMyServer.OnClientRecv(AContext: Pointer; const Data; Len: Integer);
begin
// Data/Len 已经是切好的完整消息(依框架的打包规则)
// 在这里解析协议、执行业务逻辑
end;
procedure TMyServer.OnClientDisconnect(AContext: Pointer);
begin
// 连接断开,清理上下文
end;
// 启动
var
Server: TMyServer;
begin
Server := TMyServer.Create;
Server.Port := 8888;
Server.Start; // 开始监听
// ... 保持运行
end;
客户端的使用类似:创建客户端对象、设置服务器地址、连接成功后在 OnRecv 里处理数据、用发送接口回包。
具体类名、方法名、事件签名以仓库中的源码和示例为准,不同版本可能略有差异。建议直接看仓库里的
Demo目录跑一遍最直观。
六、粘包处理:框架帮你做的重活
网络编程里绕不开“粘包/拆包”。TCP 是字节流,你对端发两次 100 字节,到达你这里可能是 200 字节一次到、也可能拆成好几段。YxdIOCP 的做法是在框架层维护每连接的接收缓冲,配合协议的长度约定(比如包头里带长度字段,或定长包),把字节流切成一条条完整消息再回调给业务层。
这意味着业务层 OnRecv 拿到的往往就是“一条完整的数据”,而不是“一堆可能不完整的字节”。这省掉了大量重复的拼包样板代码,也是这类框架最实用的地方之一。
七、适用场景与注意事项
适合: - Delphi 写的即时通讯、消息推送、游戏网关类服务端; - 需要承载大量长连接、协议自定义的后端; - 学习 IOCP 与 Pascal 网络编程的参考实现(代码量可控)。
注意: - 由于基于 IOCP,本质上是 Windows 平台方案,Linux 下需要 epoll 之类的另一套模型,不在此框架覆盖范围; - 使用前请对照仓库版本确认 API 命名与示例; - 高并发场景下仍建议对业务逻辑做线程安全评估,理解回调在哪个工作线程上执行; - 生产使用建议结合压测,验证缓冲区大小、并发数等参数。
八、小结
YxdIOCP 的意义在于:它把“Windows IOCP + 连接管理 + 粘包 + 缓冲区”这套服务端基础设施,用纯 Pascal 实现并封装成了相对容易上手的形态,让 Pascal/Delphi 开发者不必再从零造轮子,就能写出高并发的长连接服务。源码精简、结构清晰,既是可直接用的通讯框架,也是理解 IOCP 在 Pascal 中如何落地的一份不错的教材。
如果你想在 Delphi 里做点“像样”的网络服务端,不妨把仓库拉下来,跑一跑 Demo,然后照着改自己的协议——这是理解它最快的方式。
项目地址再贴一次:https://github.com/yangyxd/YxdIOCP



还没有评论,来说两句吧...