一. 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,客戶端地址peerAddr,並通過Socket封裝sockfd。且采用Channel管理該sockfd,