QSocket是QDB完成后的下一个大坑,底层会基于IOCP(Windows系)、EPoll(Linux系)和KQueue(OSX,FreeBSD系),以Delphi实现的跨平台的网络业务支持平台。
设想中的QSocket分为几个层次:
1、传输层
传输层负责数据准确送达,在传输层产生连接的概念,会为每个连接生成一个唯一的ID。传输层要支持组播和广播,如果底层不支持(如TCP协议不支持广播),则采用模拟方式实现。
这一层实际上可以认为只是操作系统底层Socket的简单封装,是所有后面的基础,而且后面的东西你可以放弃不用,提供自己的解决方案。后面的几层提供了默认的解决方案。
2、会话管理层
在QSocket中,一个请求和回应就构成一个会话。会话之间可以相互独立,也可以有先后依赖关系。每个会话拥有独立的会话编码,相互独立的会话,在传输层通过打包并行发送到服务器端,而串行的会话会严格按照投寄的先后顺序,发送到服务器端,等待回应,再发送下一个,形成一个完整的会话链条。并行的独立会话可以避免长会话阻塞短会话的问题产生。
会话层实际管理会话的投寄和派发,数据的封包格式由不同的编码器和解码器负责。我们简单描述一下普通会话的工作过程:
【发送端】
(1)、用户投寄了会话到会话管理层。
(2)、会话管理层调用编码器进行编码,然后会将编码好的会话封包入到投寄队列中。
(3)、投寄队列从会话列表中按照优先级,取数据进行打包封装。此时,会检查是否有压缩编码器的存在,有则对取出的数据进行压缩,并进一步检查是否有额外的剩余空间,循环打包至封包大小上限或者没有可供发送的数据没止。多个会话会合并到一个大的填包中一起发送。
(4)、投寄队列检查是否有加密编码器,有则将加密上一步产生的封包。然后传送给传输层,传输层将数据包发送到目标。
【接收端】
(5)、传输层将收到的数据包派发给会话管理层。
(6)、会话管理层的接收队列检查是否加密,如果加密,会检查是否有加密解码器,有则解密,如果没有,返回发送端错误代码(不支持的加密方式)。
(7)、接收队列检查数据是否被压缩,如果压缩,人检查是否有解压解码器,有则解压,如果没有,返回发送端错误代码(不支持的压缩方式)。
(8)、接收队列分解收到的数据包会话数据到相应的会话,并检查会话是否接收完成,接收完成,则触发派发操作,交由业务层处理具体的请求。如果未完成,则等待后续的数据包。
3、业务应用层
业务应用层主要是和会话管理层进行交互,完成业务逻辑的实现。这层是完全交由用户实现的。但QSocket会实现一个网络信号传送机制,以便简化业务层的开发工作。