一. TcpServer分类:

管理所有的TCP客户连接,TcpServer对于用户直接使用,直接控制由用户生活。

用户只需要设置相应的回调函数(消息处理messageCallback)然后TcpServer::start()就可以。

主要数据成员:

    boost::scoped_ptr<Accepter> acceptor_; 用来接受连接
std::map<string,TcpConnectionPtr> connections_; 用来存储全部连接
connectonCallback_,messageCallback_,writeCompleteCallback_,用来接受用户注冊的回调函数
EventLoop* loop; 接受连接的事件循环

主要功能函数:

    set*Callbak() 注冊用户回调函数
newconnection() 须要在构造函数内将其注冊给Acceptor。当Acceptor接受一个连接之后回调该函数。在本函数内部新建一个connection对象,并将 *Callback_注冊给新建的 Connection 对象。 最后,从线程池取出一个线程做I/O线程,在该I/O线程的 EventLoop 的 runInLoop() 中传入 TcpConnection::connectEstablished(). 由于必定不在一个线程中,在runInLoop()中调用EventLoop::quueInLoop(),将TcpConnection::connectEstablished()增加pendingFunctors.

二. Acceptor类:

负责监听连接请求,接收连接并将新的连接返回给TcpServer。
Acceptor主要是供TcpServer使用的,其生命期由后者控制。 一个Acceptor相当于持有服务端的一个listenning socket描写叙述符。该socket能够accept多个TCP客户连接,。

主要数据成员:

      EventLoop* loop_;
Socket acceptSocket_;封装了socket等,用来监听
Channel acceptChannel_;Acceptor通过Channel向Poller注冊事件,EventLoop通过Channel分发回调Acceptor对应的事件处理函数。
boost::function<void(sockfd,InetAddress&)>NewConnectionCallback_ , 连接请求接收之后,通过其回调TcpServer::newconnection().

主要功能函数:

      listen(),调用Socket::listen()開始监听。同一时候。调用Channel::enableReading()向Poller注冊可读事件,有数据可读代表新来了连接请求。
handleRead(),在构造函数中将其注冊给Channel::readCallback_。 当Poller发现属于Acceptor的Channel的可读事件时,在EventLoop中会驱动Channel::handleEvent()-->Channel::handleEventWithGuard()进行事件分发,调用readCallback回调 Acceptor::handlRead(),在其内调用Socekt::accept(),再回调TcpServer::newconnection(),将新连接的sockfd传回给TcpServer。

服务端监听及接受连接的流程:

   向Poller注冊监听事件的主线调用流程,TcpServer::start()-->EventLoop::runInLoop(Acceptor::listen())-->Channel::enableReading()-->Channel::update(this)-->EventLoop::updateChannel(Channel*)-->Poller::updateChannel(Channel*)
接受连接,当Poller::poll()发现有事件就绪,通过 Poller::fillActiveChannel() 将就绪事件相应的 Channel 增加 ActiveChannelList,
EventLoop::loop()-->Poller::poll()-->Poller::fillActiveChannel(),loop()-->Channel::handleEvent()->Acceptor::handleRead()->TcpServer::newConnection()->EventLoop::runInLoop(bind(&TcpConnection::connectEstablished))->EventLoop::queueInLoop()->EventLoop::loop()->EventLoop::doPendingFunctors()->TcpConnection::connectEstablished()。

三. Connection类:

用于管理一个详细的TCP客户连接,完毕用户指定的连接回调connectionCallback。
TcpConnection构造时接收參数有TCP连接的描写叙述符sockfd,服务端地址localAddr,client地址peerAddr。并通过Socket封装sockfd。 且採用Channel管理该sockfd,

主要数据成员:

         enum StateE { kDisconnected, kConnecting, kConnected, kDisconnecting };分别表示已断开,正在连接,已连接。正在断开。
scoped_ptr<Socket> socket_;封装该连接的socket
scoped_ptr<Channel> channel_;连接能够通过该channel向Poller注冊该连接的读写等事件。连接还要向Channel注冊TcpConection的可读/可写/关闭/出错系列回调函数。用于Poller返回就绪事件后Channel::handleEvent()运行对应事件的回调。
boost::function<void()> **Callback_,在TcpServer::newconnection()中创建TcpConnection时,就会将TcpServer中的各种处理函数注冊给对应的 TcpConnection::*Callback_ 。
Buffer inputBuffer_,outputBuffer_。输入输出的缓冲。

主要功能函数:

         handle{Read(),Write(),Close(),Error()},处理连接的各种事件,会由Channel::handleEvent()依据Poller返回的详细就绪事件分发调用对应的TcpConnection::handle**().
connectEstablished(),设置连接的状态为kConnected,将channel_进行绑定,调用channel::enableReading()向Poller注冊读事件,最后回调connectionCallback_会回调TcpServer中对应的回调函数。通常会在TcpServer中继续回调用户传进来的回调函数。
send(),sendInLoop(),send()有几个重载都是进行发生数据,send()-->sendInLoop(),后者中检測输出buffer中没有数据排队就直接写,假设没有写完,或者outbuffer中有数据排队则将数据追加到outbuffer中,然后调用channel::enableWriting()向Poller注冊写事件。
TcpConnection::setTcpNoDelay()->socketopt(..,TCP_NODELAY..)来关闭Nagle算法。

发送数据流程:

        TcpConnection::send(string& message)->EventLoop::runInLoop(bind(&TcpConnection::sendInLoop(string& message))->EventLoop::doPendingFunctors()->TcpConnection::sendInLoop(string& message)保证线程安全的消息发送。后经write系统调用来发送信息。

什么时候Poller当返回一个连接写或读就绪事件。类回调过程似Acceptor连接验收过程。

muduo源代码分析--Reactor在模型muduo使用(两)的更多相关文章

  1. muduo源代码分析--Reactor模式在muduo中的使用

    一. Reactor模式简单介绍 Reactor释义"反应堆",是一种事件驱动机制.和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完毕处理.而是恰恰相反.React ...

  2. muduo源代码分析--我对muduo的理解

    分为几个模块 EventLoop.TcpServer.Acceptor.TcpConnection.Channel等 对于EventLoop来说: 他仅仅关注里面的主驱动力,EventLoop中仅仅关 ...

  3. ActiveMQ的安全机制使用及其源代码分析 [转]

    ActiveMQ是目前较为流行的一款开源消息服务器.最近在项目开发中,需要为ActiveMQ开发基于IP的验证和授权机制,因此,对ActiveMQ的安全机制进行了了解,以下将介绍ActiveMQ的安全 ...

  4. 【Netty源码分析】Reactor线程模型

    1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比 ...

  5. Netty源码分析之Reactor线程模型详解

    上一篇文章,分析了Netty服务端启动的初始化过程,今天我们来分析一下Netty中的Reactor线程模型 在分析源码之前,我们先分析,哪些地方用到了EventLoop? NioServerSocke ...

  6. MyBatis架构设计及源代码分析系列(一):MyBatis架构

    如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...

  7. 服务器程序源代码分析之三:gunicorn

    服务器程序源代码分析之三:gunicorn 时间:2014-05-09 11:33:54 类别:网站架构 访问: 641 次 gunicorn是一个python web 服务部署工具,类似flup,完 ...

  8. Hadoop源代码分析

    http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...

  9. Spark SQL源代码分析之核心流程

    /** Spark SQL源代码分析系列文章*/ 自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几 ...

随机推荐

  1. stm32的串口中断

    下面有很多问题没有验证: 在设置USART_CR1中的TE位时,会发送一个空闲帧作为第一次数据发送, 目前我所了解的串口中断发送,有两种方式: 一个是:TC 一个是:TXE 这是判断两个标志位, 第一 ...

  2. 4、runtime电源管理模式(内核文档runtime_pm.txt有详细描述)

    系统睡眠模型是让整个系统休眠,而runtime是在系统正常工作的时候单独控制某个设备休眠和唤醒 1. runtime PM流程怎样动态地打开或关闭设备的电源?最简单的方法:在驱动程序里,在open函数 ...

  3. js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态)

    js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态) 一.总结 1.js函数中的private和public:js函数中的私有变量 var 变量名,公有变量 this. ...

  4. Cash Loan----:利用脚本自动化部署系统,解放我们的双手

    [前言] 现在我们的项目发布(从git上拉代码部署到Linux上)是通过脚本来完成,生产和测试环境都是运维在控制,开发联调环境由开发来负责,之前开发环境每次部署都是先在本地打好jar包然后传到服务器上 ...

  5. 仿凤凰时时彩代购平台源代码[ASP+MSSQL]完整下载

    源代码简单介绍 : 适用范围:  时时彩源代码,时时彩程序,开奖平台源代码,投注平台源代码,仿凤凰时时彩源代码 执行环境:  ASP+MSSQL 其它说明:仿凤凰时时彩代购平台源代码.网上售价8000 ...

  6. Android AIDL 小结

    1.AIDL (Android Interface Definition Language ) 2.AIDL 适用于 进程间通信,并且与Service端多个线程并发的情况,如果只是单个线程 可以使用 ...

  7. 使Sublime Text支持除UTF8外多种编码 - ConvertToUTF8

    前几天,在使用了Sublime Text多天之后,感觉完全可以代替系统自带记事本,所以就通过其打开了一个记事本文件,但是打开之后尽然是乱码,在思考了一下之后想到记事本的编码是ANSI编码,那么这就应该 ...

  8. php面试题12(多态web服务器共享session的方法:将session存到数据库)($val=&$data[$key];)

    php面试题12(多态web服务器共享session的方法:将session存到数据库)($val=&$data[$key];) 一.总结 1.多态web服务器共享session的方法: ...

  9. 【p081】ISBN号码

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定 ...

  10. 浏览器对象模型bom的作用是什么?

    浏览器对象模型bom的作用是什么? 零.总结 1.BOM提供了独立于内容而与浏览器窗口进行交互的对象 2.BOM提供了一些访问窗口对象的一些方法,我们可以用它来移动窗口位置,改变窗口大小,打开新窗口和 ...