tbnet 源码分析

来源:互联网 发布:扫图识别软件 编辑:程序博客网 时间:2024/05/21 17:20

今天下午看了看tbnet的框架,封装的很好,使用起来也比较方便。这个队列本质上是一个消费者生产者模型,两线程去工作,一个是网络读写,一个是用来进行超时检查的。

顾名思义 网络读写执行事件循环,当服务器端有可读事件时,调用回调函数读取请求数据,生产请求任务,并加入到任务队列里面去。工作线程从任务队列中获取任务,处理完成以后呢就要出发可读可写事件,,然后这个读写线程就会将处理的结果再返回给客户端。

        网上都说了:这个多线程从任务队列获取任务的需要枷锁,将会产生上下文切换。


来一张网上找到的类的联系图





   Transport类是用户使用的接口,服务器通过listen开始监听,需要传递实现IPacketStreamer和IServerAdaptor的类,其中IPacketStreamer用于数据缓冲区与packet(数据包)的相互转换,IServerAdaptor是服务器处理packet的接口,包含handlePacket和handleBatchPacket两个接口,用于处理单个数据包和批量处理数据包。
   读写线程执行eventLoop,eventLoop循环的通过EpollSocketEvent来获取准备好的描述符,准备好的事件有两种情况,分别是监听描述符上的事件(由TcpAcceptor处理)和普通请求建立的描述符(由TcpComponent处理)。TcpAcceptor将接到的请求添加到epoll集合中,TcpComponent则会调用Connect的handPacket接口,该接口会根据服务器的参数,调用iServerAdaptor的handlePacket或handleBatchPacket接口。
   客户端通过Transport::connect连接服务器,返回一个TcpConnect类,通过postPacket可向服务器发送数据包,需要指定处理回复的接口IPacketHandler,这里还可以指定额外的参数。TBNET的请求是异步处理的,其通过Channel实现,每个请求对应一个channel id,ChannelPool包含channel id到IPacketHandler的映射,postPacket时,会将packet对应的channel id与IPacketHandler及额外参数添加到ChannelPool中,当收到数据包时,根据包的channel id从ChannelPool中取出对应的handler来处理请求。ConnectionManager提供对请求连接的同一管理,提供控制连接参数,以及connect、disconnec、sendPacket等接口,客户端使用该接口发包更简单方便。



原创粉丝点击