集群聊天服务器项目【C++】(三)muduo库的简单介绍

news2024/12/26 10:56:42

在上一讲中介绍了Json库的相关知识,本次接着介绍muduo库的相关内容,这些知识在本项目中都会使用到。

1.muduo库简介

muduo库顶层就是epoll(IO复用技术) + Linux的pthread多线程,所以只能安装在Linux系统中。此外它依赖Boost库,相关的安装已经在我的博客中写出环境配置。

muduo 的线程模型为「one loop per thread + threadPool」模型。一个线程对应一个事件循环(EventLoop),也对应着一个 Reactor 模型。EventLoop 负责 IO 和定时器事件的分派。
其中有 mainReactor 和 subReactor。mainReactor通过Acceptor接收新连接,然后将新连接派发到subReactor上进行连接的维护。这样mainReactor可以只专注于监听新连接的到来,而从维护旧连接的业务中得到解放。同时多个Reactor可以并行运行在多核 CPU 中,增加服务效率。因此我们可以通过 muduo 快速完成网络模块。

如果不使用muduo库,我们想设计一个高并发的服务器,就需要使用epoll+线程池技术,手动创建epoll对象,然后在主线程注册监听连接的fd读事件,用来管理新客户的连接,如果有新连接进来就在线程池中选一个线程处理该客户的相关操作。因此主线程去管理新客户的连接,子线程去处理客户的读写事件和业务操作。
因此使用muduo库,可以让我们只关注业务模块(处理客户的读写相关事件),而不去关心网络IO模块,从而提高效率。

2.muduo库的使用

muduo库提供了两个主要的类:

  1. TcpServer:用于编写服务器程序
  2. TcpClient:用于编写客户端程序

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

  1. 组合TcpServer对象
  2. 创建EventLoop事件循环对象的指针
  3. 明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数
  4. 在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写时间的回调函数
  5. 设置合适的服务端线程数量,muduo库会自己分配I/O线程和worker线程
/*
muduo网络库给用户提供了两个主要的类
TcpServer : 用于编写服务器程序的
TcpClient : 用于编写客户端程序的

epoll + 线程池
好处:能够把网络I/O的代码和业务代码区分开
                        用户的连接和断开       用户的可读写事件
*/
#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 &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));

        // 设置服务器端的线程数量 1个I/O线程   3个worker线程(自动分配)
        _server.setThreadNum(4);
    }
    //开启事件循环
    void start()
    {
        _server.start();
    }

private:
    // 专门处理用户的连接创建和断开  epoll listenfd accept
    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();  //转成string
        cout << "recv data:" << buf << " time:" << time.toFormattedString() << endl;
        conn->send(buf);  //
    }

    TcpServer _server; // #1
    EventLoop *_loop;  // #2 epoll
};

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以阻塞方式等待新用户连接,已连接用户的读写事件等
}

3.编译和运行

muduo库依赖muduo_net.so、muduo_base.so、pthread.so三个动态链接库

3.1g++编译运行

g++ -o server muduo_server.cpp -lmuduo_net -lmuduo_base -lpthread

注意:-lmuduo_net写在前面,因为muduo_base依赖muduo_net
在这里插入图片描述

3.2vscode编译运行

在vscode里修改编译配置信息:ctrl + shift + b选择g++的哪个,在"args"中增加三个动态库链接:
在这里插入图片描述
在muduo_server.cpp里ctrl + shift + b点击编译代码,结果如下:
在这里插入图片描述
可以看到args都现显示在/usr/bin/g++ 后面,由vscode自动编译。

总结

我们使用muduo库,因为它封装了epoll和多线程,因此可以用它来处理网络IO模块,我们只需要关心业务模块,大大提高了工作效率。
业务模块只需要我们注册两个回调函数:setConnectionCallback和setMessageCallback,这样我们就能将网络IO模块和业务模块解耦。
最后编译链接后运行代码,代码正常无误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2135950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer学习(4):位置编码 Positional Encoding

为什么需要位置编码 在自注意力编码中&#xff0c;所有 a a a的计算都并行同时执行得到对应的 b b b&#xff0c;可以并行就代表着 a a a之间是不存在先后顺序关系的&#xff0c;这存在问题。 在不使用位置编码时&#xff0c;将 a 2 a_2 a2​与 a 3 a_3 a3​的顺序打乱&#…

java项目之疫情下图书馆管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的疫情下图书馆管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息。 项目简介&#xff1a; 疫情下图书馆管理系…

实景三维赋能低空经济:探索天空之城的未来图景

在数字化转型的大潮中&#xff0c;低空经济作为新兴业态正逐渐崭露头角&#xff0c;它不仅拓宽了航空业的边界&#xff0c;也为智慧城市、应急救援、物流配送、旅游观光等领域带来了前所未有的发展机遇。而实景三维技术&#xff0c;作为地理信息与遥感领域的前沿科技&#xff0…

java环境配置 | 基础铺垫

cmd命令 dir : 罗列目录下所有的文件展示出来cd xx : 进入xx文件夹cd … 返回上一级cls : 清除屏幕内容exit : 退出命令提示窗口环境变量 就是存储某个应用路径的变量,通过这个变量可以快速访问到某个应用exe 为什么要配置环境变量? 我们想要在任意的目录下都可以打开指…

小琳AI课堂:o1系列模型

大家好&#xff0c;这里是小琳AI课堂&#xff01;今天我们一起来探索OpenAI最新发布的o1系列模型&#xff0c;这可是AI领域的一大突破哦&#xff01; OpenAI o1系列模型技术大揭秘 o1系列模型是基于强化学习&#xff08;RL&#xff09;训练的&#xff0c;包括o1-preview和o1-…

彩漩科技亮相企业出海峰会,展示智能办公新力量

近日&#xff0c;在北京市海淀区商务局的指导下&#xff0c;由中关村东升科技园联合创新企业科普联盟共同举办的企业出海峰会于北京成功举办。本次峰会以“出海新征程&#xff0c;企业新高度”为核心议题&#xff0c;深入探讨全球化背景下科技企业出海面临的机遇与挑战。通过汇…

IntelliJ IDE 插件开发 | (十二)自定义项目脚手架(上)

系列文章 本系列文章已收录到专栏&#xff0c;交流群号&#xff1a;689220994&#xff0c;也可点击链接加入。 前言 在开发创建一个新项目的时候&#xff0c;我们一般都会使用平台自带的脚手架&#xff0c;如下图所示&#xff1a; 或者是使用网页版&#xff1a; 尽管平台已经…

GoogleDrive中上传文件,Java整合操作

GoogleDrive使用ServiceAccount的授权方式&#xff1a;&#xff08;科学上网&#xff09; 1.在Google Cloud中查看自己的项目&#xff1a;Dashboard – My First Project – Google Cloud console&#xff0c;没有的话新建项目。默认名称&#xff1a;My First Project 2. 创建…

基于 WeChatFerry 的 Python 机器人框架WeChatRobot

WeChatRobot 一个基于 WeChatFerry 的 Python 机器人框架。 微信机器人&#xff0c;接入Gemini、ChatGPT、ChatGLM、讯飞星火、Tigerbot&#xff1b;成语接龙、天气预报、新闻摘要、定时任务 克隆项目&#xff1a; git clone https://github.com/lich0821/WeChatRobot.git …

计算机毕业设计 沉浸式戏曲文化体验系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

百年病态集论的症结:3000年不识伪≌直线段

黄小宁 公元前1100年中国人商高同周公的一段对话谈到了勾股定理说明人类认识几何学的直线段起码已有3000多年。 直角三角形⊿的斜边c&#xff5e;水平直角边a&#xff0c;即c经旋转和均匀压缩变换可变为a&#xff5e;c。3000年不识伪≌直线段使数学认定a经刚体运动变为附着在c…

rk3399 的 HDMI 热插拔的问题

问题&#xff1a; 客户的3399 的板子上&#xff0c;烧写ubuntu 发现&#xff0c; 没有热插拔。 测试情况&#xff1a; 系统在第一次烧写完成之后&#xff0c;是有热插拔的&#xff0c;但是第二次启动就没有了。 还有一个情况&#xff0c;就是 &#xff0c;如果我一开始 上电的…

[论文精读]Polarized message-passing in graph neural networks

论文网址&#xff1a;Polarized message-passing in graph neural networks - ScienceDirect 论文代码&#xff1a;he-tiantian/PMP-GNNs&#xff1a;极化消息传递图神经网络的 Pytorch 实现&#xff0c;发表在 Artificial Intelligence&#xff0c;2024 年。 (github.com) 英…

红日靶场通关

初始准备 首先是网络配置&#xff0c;看教程来的&#xff0c;我配置完的效果如下 windows7&#xff1a;(内&#xff1a;192.168.52.143 / 外&#xff1a;192.168.154.136) windows2003&#xff1a;(内&#xff1a;192.168.52.141)windows2008:&#xff08;内&#xff1a;192.…

运算放大器选型的关键参数

上图中的顺序是从左上到右下进行选型&#xff0c;小信号看带宽&#xff0c;大信号看压摆率。一般选用电压反馈型的运放&#xff0c;但是涉及到高频特性的时候也会选择电流反馈型的运放。精密运放选用失调电压比较小的运放&#xff0c;一般失调电压在1mv左右。低功耗的情况下需要…

极越造车2.0:01销量回暖,07杀出血路,ASD抢跑FSD

‍‍‍作者 |张马也 编辑 |德新 9月13日&#xff0c;极越公布其第二款车型极越07上市48小时内&#xff0c;订单超过5000台。 对这家造车4年多的车企来说&#xff0c;这意味着新车取得了初步的成功。 懂车帝的数据显示&#xff0c;7月极越01销量1143台&#xff0c;8月销量则翻…

Linux 入门:简单的基础操作

“批判他人总是想的太简单 剖析自己总是想的太困难” 文章目录 前言Linux 入门&#xff1a;从基础操作到 WSL2 安装文章有误敬请斧正 不胜感恩&#xff01;1. 什么是 Linux&#xff1f;2. Linux 和其他系统有啥不同&#xff1f;3. Linux 的主要组成4. 常见 Linux 发行版5. 基本…

openstack之cinder介绍

概念 cinder 为虚拟机提供管理块存储服务。支持的文件系统&#xff1a;lvm、iscsi、nfs、san、RBD 组件构成及功能介绍 cinder api&#xff1a;在控制节点运行&#xff0c;管理服务的接口&#xff0c;被命令行、其他组件调用&#xff1b; cinder scheduler&#xff1a;类似n…

大数据新视界 --大数据大厂之Kafka消息队列实战:实现高吞吐量数据传输

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

美国税收制度及SAP实施

1. 税制综述 美国是以直接税为主的国家,实行联邦、州和地方&#xff08;市、县&#xff09;三级征税制度&#xff0c;属于彻底的分税制国家。美国联邦税以个人所得税和企业所得税为其主要收入来源&#xff0c;州税以销售与使用税为其主要收入来源&#xff0c;地方税以财产税为…