连接时序¶
各个组件的关系¶
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(...)
。并且为这个连接具有的通道注册可读事件。运行结束一个面向客户端的接口就建立完成。