当前位置: 首页 > news >正文

基于mormot.net.async.pas实现一个纯粹的Socket Server

源码是mORMot框架的一部分,专注于事件驱动的异步网络处理,支持高并发连接,使用轮询(poll/epoll/IOCP)机制来管理非阻塞套接字。它不是从零实现的底层Socket API,而是构建在mORMot的核心Socket库(mormot.net.sock)之上的高级抽象。

源码分析概述

  • 核心组件
    • TPollAsyncSockets:低级轮询类,处理非阻塞套接字的读/写事件。支持Windows IOCP、epoll(Linux)或poll/select。负责缓冲区管理和事件通知(OnRead/AfterWrite)。
    • TPollAsyncConnection:每个连接的抽象基类。管理缓冲区(fRd/fWr)、TLS支持、读/写锁。需要重写OnRead来处理传入数据。
    • TAsyncConnections:管理多个连接的线程池抽象类。处理连接的添加/删除、垃圾回收(GC)、空闲超时。支持线程亲和性(CPU/Socket)。
    • TAsyncServer:继承自TAsyncConnections,实现服务器端。监听端口,接受新连接,并将它们添加到轮询中。使用线程池处理读/写。
    • TAsyncConnection:服务器连接的具体类(继承TPollAsyncConnection)。添加了远程IP、最后操作时间等字段,支持心跳(OnLastOperationIdle)。
  • 关键机制
    • 非阻塞模式:所有套接字设置为非阻塞,依赖轮询检测事件。
    • 线程池:TAsyncConnectionsThreads处理读/写。默认一个线程用于接受连接,一个用于写,其他用于读。
    • 缓冲区:每个连接有独立的读/写缓冲(TRawByteStringBuffer),支持异步发送(Write方法)。
    • 事件回调:OnStart/OnStop/OnFirstRead用于连接生命周期;OnRead处理数据;AfterWrite处理发送完成。
    • 选项:TAsyncConnectionsOptions控制日志、TLS、轮询行为等。
    • GC:连接关闭后延迟释放(KeepConnectionInstanceMS,默认100ms),避免并发问题。
  • 适用性:源码适合高性能服务器(数千连接),但如果您想要“纯粹”的Socket Server(简单echo服务器或自定义协议),可以简化使用,只重写OnRead来处理数据,而忽略HTTP相关部分(如THttpAsyncServer)。
  • 限制
    • 依赖mORMot框架的其他单元(如mormot.core.os、mormot.net.sock)。
    • 默认支持TLS(acoEnableTls选项),但可以禁用。
    • Windows下优先IOCP,POSIX下优先epoll。

如果您想从零实现Socket Server(不依赖框架),可以直接用Delphi的TIdTCPServer或WinSock API。但既然问题是基于此源码,我将指导如何用它实现。

如何实现纯粹的Socket Server

基于源码,您可以创建一个简单的TCP Echo服务器(客户端发送数据,服务器回显)。步骤如下:

1. 准备环境
  • 确保有mORMot框架(从GitHub下载或使用源码)。
  • 包含必要的单元:mormot.net.async, mormot.net.sock, mormot.core.base 等。
  • 定义一个继承自TAsyncConnection的类来处理每个连接。
2. 定义连接类(继承TAsyncConnection)

这是核心:重写OnRead来处理传入数据。

unit MySocketConnection;interfaceusesmormot.net.async,mormot.core.base,mormot.core.log;typeTMySocketConnection = class(TAsyncConnection)protectedfunction OnRead: TPollAsyncSocketOnReadWrite; override;function OnLastOperationIdle(nowsec: TAsyncConnectionSec): boolean; override;end;implementationfunction TMySocketConnection.OnRead: TPollAsyncSocketOnReadWrite;
varlen: integer;data: RawByteString;
beginresult := soContinue; // 默认继续读if fRd.Len > 0 thenbegin// 从读缓冲区提取数据data := fRd.Copy; // 或 fRd.ReadAllfRd.Reset; // 清空缓冲// 处理数据:这里简单回显(echo)len := Length(data);if len > 0 thenbeginOwner.LogVerbose(self, 'Received', [data]); // 可选日志
http://www.dtcms.com/a/523876.html

相关文章:

  • FastReport .NET 2026.1 全新发布: 统一Demo中心、全新Ribbon界面、Excel公式导出、Word图像质量设置等重磅升级!
  • 网站后台上传图片脚本错误个人博客大全
  • 郑州水晶奖杯制作wordpress加载优化
  • 【计算机网络笔记】第二章 应用层 (Application Layer)
  • 东营聊城网站建设seo门户网站建设
  • DigitalOcean Gradient™ 平台上线 fal 四款多模态 AI 模型:快速生成图像与音频
  • 5、服务器互连技术(小白入门版)
  • 我爱学算法之—— 分治-归并
  • 济南高新区 网站制作wordpress直接购买
  • 织梦网站首页幻灯片不显示新华美玉官方网站在线做
  • 蓝色星球如何打造能与企业共同进化的灵活系统
  • 【问题】在VSCode中设置conda的Python环境
  • NGINX 负载均衡应用实战:从配置到策略的深度解析
  • 关于buildroot文件系统中rootfs的内容,该怎么增删(瑞芯微rv1126b)
  • Qt 入门简洁笔记:信号与槽
  • 算法入门---专题二:滑动窗口2(最大连续1的个数,无重复字符的最长子串 )
  • 手机摄像头如何识别体检的色盲检查图的数字和图案(下)
  • 政务系统信创改造中,金仓日志如何满足等保2.0三级审计要求
  • 记录一个监控网卡某个IP发送流量
  • Python-UnitTest框架
  • 模型-模型压缩:量化、剪枝、蒸馏、二值化
  • UE5 蓝图-12:pawn蓝图,轴映射-鼠标右键,补充轴映射与操作映射的区别。相机的旋转俯仰逻辑,伸缩逻辑,浮点差值函数 FInterpTo;
  • Vcenter7使用主机配置文件重置ESXI主机 root 密码
  • STL 容器:List
  • 做网站销售好累网上开店的货源渠道有哪些
  • 图像,视频Lora模型训练的Timestep Type时间步类型
  • 告别云端依赖!ComfyUI本地化视频生成实战教程+cpolar实战
  • Android16之如何获取APP、Bin进程的UID(二百六十三)
  • 在JavaScript / HTML中,无法通过开发者工具查看DOM元素中input里输入的密码
  • 像素塔防游戏:像素守卫者