muduo网络库2-muduo网络库实例

时间:2025-02-27 21:25:08

muduo网络库实质为: epoll + 线程池,优点是能够将网络I/O的代码和业务代码分开。 而业务代码主要分为:用户的连接和断开、用户的可读写事件两类。至于什么时候发生这些事件,由网络库进行上报,如何监听这些事件,都是网络库所封装好的,我们就可以快速进行项目开发。

muduo给用户提供了两个主要的类:
1、TcpServer:用于编写服务器程序。
2、TcpClient:用于编写客户端程序。

如何配置muduo网络库请参考: 写文章-****创作中心

 muduo网络库服务器编程

        基于muduo网络库开发服务器程序

  1. 组合TcpServer对象
  2. 创建EventLoop事件循环对象的指针
  3. 明确TcpServer构造函数需要什么参数,输出ChatServer的参数
  4. 在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <iostream>
#include <functional>
#include <string>
using namespace std;
using namespace muduo;
using namespace muduo::net;
using namespace placeholders;

class ChatServer
{
public:
    ChatServer(EventLoop *loop,
               const InetAddress &serverAddr,
               const string &nameArg)
        : _server(loop, serverAddr, nameArg), _loop(loop)
    {
        // 注册连接回调
        _server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));

        // 注册消息回调
        _server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));

        // 设置线程数量
        _server.setThreadNum(4); // 4个IO线程
    }

    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;
        }
    }

    // 处理消息
    void onMessage(const TcpConnectionPtr &conn, Buffer *buffer, Timestamp time)
    {
        string buf = buffer->retrieveAllAsString();
        cout << "recv data: " << buf << " time: " << time.toString() << endl;
        conn->send(buf); // 回显消息
    }

    TcpServer _server;
    EventLoop *_loop;
};

int main()
{
    EventLoop loop;
    InetAddress addr("127.0.0.1", 9898); // 监听 127.0.0.1:9898
    ChatServer server(&loop, addr, "ChatServer");
    server.start(); // 启动服务器
    loop.loop();    // 事件循环
    return 0;
}

         上面的代码简单的使用了muduo网络库实现了一个回显服务器,我们可以在linux系统终端中使用telnet命令让客户端连接。