muduo网络库的使用
在重写muduo网络库之前,首先就要知道它怎么用,对他的处理的过程有一个大概的了解,才能更好的理解它的设计以及它为什么这样设计。
因为我已经提前把muduo的核心模块重写并编译成动态库,才写的复习总结博客,就以当初写的测试程序为例:
#include <mymuduo/TcpServer.h>
#include <mymuduo/Logger.h>
#include <functional>
#include <string>
class EchoServer
{
public:
EchoServer(EventLoop* loop, const InetAddress &addr,const std::string &name)
:loop_(loop)
,server_(loop,addr,name)
{
//注册回调函数
server_.setMessageCallback(
std::bind(&EchoServer::onMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
);
server_.setConnectionCallback(
std::bind(&EchoServer::onConnection, this, std::placeholders::_1)
);
//设置线程数量
server_.setThreadNum(3);
}
void start()
{
server_.start();
}
private:
void onConnection(const TcpConnectionPtr& conn)
{
if(conn->connected())
{
LOG_INFO("Connect UP : %s", conn->peerAddress().toIpPort().c_str());
}
else
{
LOG_INFO("Connect DOWN : %s", conn->peerAddress().toIpPort().c_str());
}
}
void onMessage(const TcpConnectionPtr& conn,
Buffer* buf,
Timestamp time)
{
std::string msg = buf->retrieveAllAsString();
conn->send(msg);
conn->shutdown();
}
EventLoop* loop_;
TcpServer server_;
};
int main()
{
EventLoop loop;
InetAddress addr(8000);
EchoServer server(&loop, addr, "EchoServer-01");
server.start();
loop.loop();
return 0;
}
muduo网络库有两个核心对象:TcpServer服务器对象和EventLoop事件循环对象,在我们编写服务器程序的时候都会用到这两个对象。
TcpServer的初始化需要三个参数:EventLoop事件循环、服务器地址和监听端口、服务器名。EventLoop需要我们自己定义,InetAddress封装了服务器的IP地址和端口号,我在写InetAddress的初始化时把IP地址给了一个127.0.0.1的默认值。
创建EventLoop并初始化TcpServer后,就需要在TcpServer上注册对应事件的回调函数,在事件发生时会调用他们。
然后就是设置线程数量了(不包括mainReactor),一般设为机器CPU的核数-1。
服务器初始化完成后,调用TcpServer的start方法,启动Reactor,开辟对应数量的线程并初始化,然后就是调用EventLoop的loop方法开启事件循环进行事件的监听和处理了。