跳转至

连接时序

各个组件的关系

    TcpServer
        |__TcpConnection 
        |__Acceptor
        |__EventLoop

    TcpConnections
        |__Socket       
        |__Channel
        |__EventLoop
        |___InetAddress 

一个TcpServer,可能会和多个客户端建立连接,因此需要一个数据结构来存储来自客户端的多个TcpConnection对象,而Acceptor则是监听客户端的请求。

TcpConnection 是服务器和客户端通讯的接口:与客户端连接建立,通讯,关闭都是通过TcpConnection实现。因此TcpConnection设置了一系列的回调函数是通过TcpServer中传入的。

连接建立时序

当有新的客户端连接到来时,在TcpServer中先会执行TcpServer::newConnection,为新的请求建立一个TcpConnection对象conn,然后为这个连接设置相应的回调函数:

void TcpServer::newConnection(int sockfd, const InetAddress& peerAddr) {
    loop_->assertInLoopThread();
    ...
    InetAddress localAddr(sockets::getLocalAddr(sockfd));
    TcpConnectionPtr conn(new TcpConnection(ioLoop, connName, sockfd,
                                            localAddr, peerAddr));
    connections_[connName] = conn;  
    // 回调函数设置
    conn->setConnectionCallback(connectionCallback_);
    conn->setMessageCallback(messageCallback_);
    conn->setWriteCompleteCallback(writeCompleteCallback_);
    conn->setCloseCallback(std::bind(&TcpServer::removeConnection, this, _1)); 
    // 运行新的连接建立
    conn->connectEstablished();
}
当设置完回到函数,就会运行TcpConnection::connectEstablished,为新建立的conn设置一些属性,
    void TcpConnection::connectEstablished() {
        loop_->assertInLoopThread();
        assert(state_ == kConnecting);
        setState(kConnected);
        channel_->tie(shared_from_this());
        channel_->enableReading();  
        connectionCallback_(shared_from_this()); // 外部传入的回调函数
    }
在这个函数中,connectionCallback_调用外部传入的回调函数,比如onConnection(...)。并且为这个连接具有的通道注册可读事件。运行结束一个面向客户端的接口就建立完成。