muduo网络库介绍
我觉得我的介绍肯定是没有陈硕大神介绍的完整,所以我这里直接贴上陈硕的原文链接:muduo网络库
在这里,我将只讨论muduo的使用,后续源码剖析可以关注专栏:muduo网络库
使用muduo进行server端编程
在muduo中有两个比较主要的类:TcpServer
和TcpClient
。
TcpServer:服务器编写
TcpClient:客户端编写
在这里我目前将只介绍服务器端的编写流程:
/* * 1.组合tcpserver对象 * 2.创建eventloop事件循环对象的指针 * 3.明确tcpserver需要的参数,输出构造函数 * 4.在当前服务器类的构造函数中,注册处理连接的回调函数和处理读写事件的回调函数 * 5.设置合适的服务端线程数量,muduo库会自己划分io分发线程和工作线程 */
根据编写流程,我们可以构建 如下类:
class ChatServer
{
public:
//事件循环 ip+prot 服务器名称
ChatServer(EventLoop* loop, const InetAddress& listenAddr, const string& nameArg)
:server_(loop, listenAddr, nameArg),
loop_(loop)
{
//给服务器注册用户连接的创建和断开回调
server_.setConnectionCallback(std::bind(&ChatServer::onConnection,this,_1));
//给服务器注册用户读写事件回调
server_.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));
//设置服务器端的线程数量 一个io分发线程,其他工作线程
server_.setThreadNum(4);
}
//开启事件循环
void start()
{
server_.start();
}
private: //专门处理用户连接和断开
void onConnection(const TcpConnectionPtr& conn)
{
//如果是连接状态
if (conn->connected())
{
cout << conn->peerAddress().toIpPort() << "->" <<
conn->localAddress().toIpPort << "state:online" << endl;
}
else
{
cout << conn->peerAddress().toIpPort() << "->" <<
conn->localAddress().toIpPort << "state:unline" << endl;
conn->shutdown();
//loop_->quit();
}
}
void onMessage(const TcpConnectionPtr& conn, Buffer* buffer, Timestamp time)
{
string buf = buffer->retrieveAllAsString();
cout << "recv data: " << buf << "time: " << time.toString() << endl;
conn->send(buf);
}
private:
TcpServer server_;
EventLoop* loop_;
};
然后在主函数中测试我们创建的类对象:
int main()
{
EventLoop loop; //epoll
InetAddress addr("192.168.152.129", 6000);
ChatServer server(&loop, addr, "Chat Server");
server.start();
loop.loop(); //阻塞调用epoll_wait
return 0;
}
参考文献
[1] 施磊.集群聊天服务器.图论科技.2020.7.