[集群聊天项目] muduo网络库

目录

  • 网络服务器编程常用模型
  • 什么是muduo网络库
    • 什么是epoll
  • muduo网络库服务器编程

网络服务器编程常用模型

【方案1】 : accept + read/write
不是并发服务器

【方案2】 : accept + fork - process-pre-connection
适合并发连接数不大,计算任务工作量大于fork的开销

【方案3】 :accept + thread thread-pre-connection
比方案2的开销小了一点,但是并发造成线程堆积过多

【方案4】: muduo的网络设计:reactors in threads - one loop per thread

【方案5】 : reactors in process - one loop pre process
nginx服务器的网络模块设计,基于进程设计,采用多个Reactors充当I/O进程和工作进程,通过一把accept锁,完美解决多个Reactors的“惊群现象”

什么是muduo网络库

高并发,因此服务器要用muduo编程
在这里插入图片描述
在这里插入图片描述

方案的特点是one loop per thread(一个线程一个时间循环),有一个main reactor负载accept连接(I/O线程),然后把连接分发到某个sub reactor(采用round-robin[轮询]的方式来选择sub reactor),该连接的所用操作都在那个sub reactor所处的线程中完成,注册到某个线程的epoll事件上,那么所做的所有读写操作都在这个epoll上完成。多个连接可能被分派到多个线程中,以充分利用CPU。

Reactor poll的大小是固定的,根据CPU的数目确定。

如果有过多的耗费CPU I/O的计算任务,可以提交到创建的ThreadPool线程池中专门处理耗时的计算任
务。

// 设置EventLoop的线程个数,底层通过EventLoopThreadPool线程池管理线程类EventLoopThread
_server.setThreadNum(10);

一个Base IO thread负责accept新的连接,接收到新的连接以后,使用轮询的方式在reactor pool中找
到合适的sub reactor将这个连接挂载上去,这个连接上的所有任务都在这个sub reactor上完成。

什么是epoll

学习资料
epoll 是 Linux 内核的可扩展 I/O 事件通知机制,其最大的特点就是性能优异。
在这里插入图片描述

muduo网络库服务器编程

moduo库的使用需要链接libmuduo_base.solibmuduo_net.solibpthread.so库,我们执行的时候需要-lmuduo_net -lmuduo_base -lpthread,需要配置这些。

muduo网络库给用户提供了两个主要的类

  • TcpSever : 用于编写服务器程序的
  • TcpClient : 用于编写客户端程序的

eopll + 线程池
好处:能把网络I/O的代码和业务代码区分开

业务代码的暴露主要有两个:用户的连接和断开,用户的可读写事件。我们只需要关注这两个事件怎么做,至于什么时候发生这些事情(网络库上报)以及怎么监听这些事件的发生,都是由网络库实现好的。

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

1. 组合TcpSevrer对象:不指定构造TcpServer _server;就要用默认构造,但是进入到TcpServer.h中发现TcpServer没有默认构造,因此要指定_server相应的构造,在pubilc中。不指定,ChatServer类无法创建对象。
TcpServer没有默认构造

2. 创建EventLoop事件循环对象的指针

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

3. 明确TcpServer构造函数需要什么函数,输出ChatServer的构造函数

ChatServer(EventLoop *loop,               // 事件循环const InetAddress &listenAddr, // IP地址+端口const string &nameArg)         // 服务器的名字: _server(loop, listenAddr, nameArg), _loop(loop)
{}

4.在当前服务器类的构造函数中,注册处理连接的回调函数和处理读写事件的回调函数。将处理业务的代码onConnectiononMessage分离出来,和对应的Callback代码绑定到一起,其中onConnectiononMessage两个函数的参数类型和数量是根据Callback函数设置的。
在这里插入图片描述

// 给服务器注册用户连接的创建和断开回调,一旦监听到此活动,就会调用onConnection函数
// 人家的Callback函数只有一个参数,但是自己写的onConnection有两个参数,隐含一个this
// _1是参数占位符(需要using namespace placeholders;),是onConnection括号中的参数
_server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));
// 给服务器注册用户读写事件回调
_server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));
// **************************************************************
// 专门处理用户的连接创建和断开 epoll  listenfd accept
void onConnection(const TcpConnectionPtr &conn)
{// 放业务代码}// 专门处理用户的读写事件
void onMessage(const TcpConnectionPtr &conn, // 连接Buffer *buffer,               // 缓冲区Timestamp time)               // 接收到数据的时间信息
{// 放业务代码}

5. 设置合适的服务端线程数,muduo库会自己分配I/O线程和worker线程

// 设置服务器端的线程数量 1个I/O线程 3个worker线程
_server.setThreadNum(4);

全部代码:

#include <muduo/net/TcpServer.h>
#include <muduo/net/TcpClient.h>
#include <iostream>
#include <functional> //绑定器在此文件中
#include <string>
using namespace std;
using namespace muduo;
using namespace muduo::net;
using namespace placeholders;class ChatServer
{
public:// #3ChatServer(EventLoop *loop,const InetAddress &listenAddr,const string &nameArg): _server(loop, listenAddr, nameArg), _loop(loop){// #4_server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));_server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));// #5_server.setThreadNum(4);}// 开启事件循环void start(){_server.start();}private:// 专门处理用户的连接创建和断开 epoll  listenfd acceptvoid 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 buff = buffer->retrieveAllAsString();cout << "recv data:" << buff << "time: " << time.toString() << endl;conn->send(buff);}TcpServer _server;EventLoop *_loop;
};int main()
{EventLoop loop; // epollInetAddress addr("127.0.0.1", 6000);ChatServer server(&loop, addr, "ChatServer");server.start(); // 启动服务, listenfd epoll_atl=>epollloop.loop();    // epoll_wait以阻塞方式等待新用户链接,已连接用户的读写事件等操作return 0;
}

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

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

相关文章

在Vue中如何渲染使用Vue写法的HTML文件?

在Vue.js中&#xff0c;我们可以使用Vue的语法来编写HTML文件&#xff0c;并通过Vue实例来渲染这些文件。下面是一种常见的方法&#xff1a; 创建Vue实例&#xff1a;首先&#xff0c;我们需要创建一个Vue实例&#xff0c;以便将Vue绑定到HTML文件中。 指定el属性&#xff1a;…

在 Linux 上把 Vim 配置为默认编辑器

目录 ⛳️推荐 在 Linux 命令行中编辑 将 Vim 设置为其他程序的默认值 在 Alpine 中编辑电子邮件 总结 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 我使用 Linux 大概有…

NTP授时服务器(GPS授时器)在DCS系统应用

NTP授时服务器&#xff08;GPS授时器&#xff09;在DCS系统应用 前言 随着计算机和网络通信技术的飞速发展&#xff0c;各行业自动化系统数字化、网络化的时代已经到来。这一方面为各控制和信息系统之间的数据交换、分析和应用提供了更好的平台、另一方面对各种实时和历史数据…

【MHA】MySQL高可用MHA介绍7-常见问题

目录 常见问题解答 支持哪些 MySQL 版本&#xff1f; 支持哪些操作系统&#xff1f; MHA 可靠吗&#xff1f; 是否提供 MHA 的商业支持&#xff1f; 是否支持基于行的二进制日志格式&#xff1f; 在云环境中是否工作&#xff1f; 是否有其他解决方案可以完成与 MHA 相同…

Golang实现一个批量自动化执行树莓派指令的软件(1)文本加密配置命令行交互实现

简介 实现一个在配置文件设置信息&#xff0c;一运行就可以自动执行设定指令的软件。 这次实现的是 &#xff1a; 1. 加密解密模块&#xff0c; 用于加密密码&#xff0c; 在配置时配置已加密的密码就可以&#xff1b; 2. 需要配置&#xff0c;自然也就有配置文件的序列化反序列…

Unity读书系列《Unity3D游戏开发》——脚本(一)

文章目录 前言一、脚本模版及其拓展1、脚本模版2、拓展脚本模版 二、脚本的生命周期三、脚本的执行顺序四、脚本序列化1、序列化数据2、serializedObject3、监听部分元素修改事件 五、定时器与间隔定时器六、工作线程&#xff08;多线程&#xff09;总结 前言 脚本在Unity的重…

【信安评估】2024年全国职业院校技能大赛高职组“信息安全管理与评估”安徽省选拔赛赛项规程

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技…

ChatGPT API - 笔记

1 新手如何用Python玩转ChatGPT API,详细讲解 新手如何用Python玩转ChatGPT API,详细讲解-Django社区,Django中文网,django教程,Django! import time import requestsOPENAI_API_KEY = "****" proxy = "127.0.0.1:7890" # 你需要添加你的代理,懂得都…

Centos的一些基础命令

CentOS是一个基于开源代码构建的免费Linux发行版&#xff0c;它由Red Hat Enterprise Linux (RHEL) 的源代码重新编译而成。由于 CentOS是基于RHEL构建的&#xff0c;因此它与RHEL具有非常类似的特性和功能&#xff0c;包括稳定性、安全性和可靠性。并且大部分的 Linux 命令在C…

sqlplus / as sysdba登陆失败,(ORA-01017)

周一上班检查alert log&#xff0c;看到某个库报出大量的错误 提示无法连接到ASM实例&#xff0c;这是某知名MES厂商DBA创建的11G RAC刚刚​转交到我手上的&#xff0c;这又是给我挖了什么坑&#xff1f; 报错为ORA-01017​用户名密码不对&#xff1f;​what&#xff1f; 登陆o…

大语言模型在研究领域的应用——信息检索中的大语言模型

信息检索中的大语言模型 大语言模型提升信息检索任务利用大语言模型进行信息检索大语言模型增强的信息检索模型.检索增强的大语言模型输入优化策略.指令微调策略.预训练策略.总结应用建议未来方向大语言模型对于传统信息检索技术与应用范式带来了重要影响。这两者在技术路径上具…

在Mac M1笔记本上跑大语言模型llama3的4个步骤?(install、pull、run、ask)

要点 Ollama一个功能强大的本地大语言模型LLM运行工具&#xff0c;支持很多模型&#xff0c;并且操作极其简单快速回忆步骤&#xff1a; 下载ollama工具&#xff1a;https://ollama.com/download 下载模型&#xff1a;ollama pull llama3 #根据libs列表直接指定名字 运行模型…

HttpURLConnection 接收长字符串时出现中文乱码出现问号��

HttpURLConnection 接收长字符串的时候随机位置出现中文乱码&#xff0c;显示问号&#xff0c;究其原因是utf8解码长度问题&#xff0c;程序上写法需要注意&#xff0c;要把字节全部读进来一起转码&#xff0c;不能边读取边转码&#xff0c;会截断中文的字节码&#xff0c;导致…

卡巴斯基plus(kaspersky plus) 21.16主界面出不来

请选择下载x86版本的dotnet 6.0 x86版本的dotnet 6.0 https://download.visualstudio.microsoft.com/download/pr/4aded178-a52a-4fcc-a779-59bb444df048/67924e3556a3a69da09528bd74dca9ef/dotnet-sdk-6.0.421-win-x86.exe

企业微信hook接口协议,ipad协议http,发送大视频文件

发送大视频文件 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人或群idisRoom是bool是否是群消息 请求示例 {"uuid":"1688853790xxx", //uuid 默认随机生成如果初始化传了id则用初始…

软考-论文写作-论架构风格论文

题目 素材 框架 一、 摘要 2020年12月,我参加了某省政协委员履职系统的开发。该系统为政协机关人员线上开展各项工作以及委员完成各项履职提供了全方位的软件支撑。我在该项目重担任系统架构师一职,负责履职系统的架构设计。本文结合实践,以委员履职系统为例,主要讨论软件…

12.6.1 实验5:IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

密码学系列0-总述

通过这一系列文章&#xff0c;帮助读者能快速入门密码学安全性证明。 这一系列文章主要包括以下内容&#xff1a; 1.可证明安全的概念 2.密码学常用困难性问题&#xff1a;CDH,DDH,DLP,BDH等。然后讨论问非对称&#xff0c;对称双线性配对上困难性问题。讨论为什么对称双线性DD…

问答机器人学习资料

longchain 5 分钟内搭建一个免费问答机器人&#xff1a;Milvus LangChain-腾讯云开发者社区-腾讯云 chatglm大模型 基于本地知识的问答机器人langchain-ChatGLM 大语言模型实现方法详解_python_脚本之家 探索QRobot&#xff1a;智能对话与聊天机器人的开源奇缘-CSDN博客 如何…

推荐一个带java环境的tomcat镜像,使用jdk 1.8.0_312

镜像名称和版本&#xff1a;tomcat:10.0-jdk8拉取命令&#xff1a;docker pull tomcat:10.0-jdk8镜像tar包&#xff08;百度网盘&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1TM8k7Z97NYhahCrrTh3vBw?pwdrq93 提取码&#xff1a;rq93docker启动命令&am…