环境安装配置请看这篇文章:
https://blog.csdn.net/xiaoduan6/article/details/125023408流程
- 组合TcpServer对象
- 创建EventLoop事件循环对象
- 明确TcPServer构造函数的参数,输出CharServer的参数
- 在当前服务器类的构造函数中,注册处理连接的回调函数
- 设置合适的服务器的线程数量,muduo库会自己分配I/O线程和worker线程
vim muduo_server.cpp
#include测试#include #include #include #include using namespace std; using namespace muduo; using namespace muduo::net; using namespace placeholders; class ChatServer { public: ChatServer(EventLoop *loop, //事件循环 const InetAddress &listenAddr, // IP+Port 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)); //设置服务器的线程数量 _server.setThreadNum(2); } //开启事件循环 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:offline " << endl; conn->shutdown(); //close(fd) //_loop->quit(); } } //专门处理用户的读写事件 void onMessage(const TcpConnectionPtr &conn, //连接 Buffer *buffer, //缓冲区 Timestamp time) //接受数据的时间信息 { string buf=buffer->retrieveAllAsString(); cout<<"recv data: "< send(buf); } TcpServer _server; EventLoop *_loop; }; int main() { EventLoop loop; //epoll InetAddress addr("127.0.0.1",6000); ChatServer server(&loop,addr,"ChatServer"); server.start(); //listenfd epoll_ctl -> epoll loop.loop(); //epoll_wait以阻塞的方式等待新用户连接,已连接用户的读写事件等 return 0; }
第一个shell: g++ -o server muduo_server.cpp -lmuduo_net -lmuduo_base -lpthread 第二个shell telnet 127.0.0.1 6000



