集群聊天服务器(3)muduo网络库

目录

  • 基于muduo的客户端服务器编程

muduo只能装在linux中,依赖boost库
客户端并不需要高并发

基于muduo的客户端服务器编程

支持epoll+线程池,muduo封装了线程池
而且还有完善的日志系统
使用muduo库代码非常固定,基本就只有chatserver的类名要改

/*
muduo网络库给用户提供了两个主要的类
TcpServer:用于编写服务器程序的
TcpClient:用于编写客户端程序将epoll+线程池封装起来
好处:能够把网络io的代码和业务代码区分开用户的连接和断开    用户的可读写事件*/
#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;/*基于muduo网络库开发服务器程序
1.组合TcpServer对象
2.创建EventLoop事件循环对象的指针
3.明确TcpServer构造函数需要什么参数
4.在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数
5.设置合适的服务器线程数量,muduo库会自己分配I/O线程和worker线程
*/
class ChatServer
{
public:ChatServer(EventLoop* loop,//事件循环const InetAddress& listenAddr,//IP+Portconst 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 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)}}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;//1.定义一个server对象,这是第一步EventLoop *_loop;
};int main()
{EventLoop loop;//epoll,特别像创建了epollInetAddress addr("127.0.0.1",6000);ChatServer server(&loop,addr,"ChatServer");server.start();//启动了服务:listenfd epoll_ctl添加到epoll上loop.loop();//相当于调用了epoll_wait以阻塞方式等待新用户连接,已连接用户的读写事件等return 0;
}

编译需要添加链接

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

-lmuduo_net,l跟库名称
在这里插入图片描述
用一个客户端去连接他,发现连上了
在这里插入图片描述
在客户端中发送helloworld
在这里插入图片描述
ctrl+],显示telnet,输入quit退出客户端
在这里插入图片描述
vscode中配置命令所需要依赖的库,方便输出代码,最好在linux
在这里插入图片描述

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

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

相关文章

【Python刷题】最少拐弯路线问题

题目描述 洛谷P1649 一、题目理解 首先&#xff0c;我们来看一下这道题目的要求。题目给定了一个 NN&#xff08;1≤N≤100&#xff09; 的方格&#xff0c;方格中的每个格子有不同的状态&#xff0c;用 . 表示可以行走的格子&#xff0c;x 表示不能行走的格子&#xff0c;…

在windows系统里面部署 Redis

在windows中下载安装REdis 1.下载mis 地址添加链接描述 然后直接下载安装然后点击你的库 2.然后选择好之后选择好路径就行了。 然后我们点击这个cli.exe文件然后双击打开输入 在命令框里输入&#xff1a; 如果显示的和图片显示的一样&#xff0c;则证明你已经在本地部署好了…

NTP博客

使用nmtui命令修改IP&#xff1a; 注意&#xff1a; 修改之后&#xff0c;要激活&#xff1a; nmcli connection up ens160 1、软件安装 #设置当前时区 [rootlocalhost ~]# timedatectl set-timezone Asia/Shanghai 1.1.配置国内阿里yum源 [rootredhat ~]# cd /etc/yum.r…

《Large-scale Multi-modal Pre-trained Models: A Comprehensive Survey》中文校对版

文章汉化系列目录 文章目录 文章汉化系列目录摘要引言2 背景2.1 传统深度学习2.2 自然语言处理中的预训练2.3 计算机视觉中的预训练2.4 音频与语音中的预训练 3 多模态预训练3.1 任务定义与关键挑战3.2 MM-PTM的优势3.3 预训练数据3.4 预训练目标3.5 预训练网络架构3.5.1 自注意…

从源码角度分析JDK动态代理

文章目录 前言一、JDK动态代理二、动态代理的生成三、invoke的运行时调用总结 前言 本篇从源码的角度&#xff0c;对JDK动态代理的实现&#xff0c;工作原理做简要分析。 一、JDK动态代理 JDK动态代理是运行时动态代理的一种实现&#xff0c;相比较于CGLIB &#xff0c;目标对象…

操作系统——计算机系统概述——1.5操作系统引导(开机过程)

操作系统引导&#xff1a; A.CPU从一个特定主存地址开始&#xff0c;取指令&#xff0c;执行ROM中的引导程序&#xff08;先进行硬件自检&#xff0c;再开机&#xff09; B.将磁盘的第一块——主引导记录读入内存&#xff0c;执行磁盘引导程序&#xff0c;扫描分区表 C.从活动分…

推荐一本python学习书:《编程不难》

推荐理由 全面&#xff1a;把零基础Python编程、可视化、数学、数据、机器学习&#xff0c;融合在一起&#xff0c;循循渐进。 开源&#xff1a;PDF、Python代码、Jupyter文档&#xff0c;在github直接免费下&#xff01; 真实&#xff1a;提供大量真实场景下的数据&#xff…

数据结构与算法分析模拟试题及答案5

模拟试题&#xff08;五&#xff09; 一、单项选择题&#xff08;每小题 2 分&#xff0c;共20分&#xff09; &#xff08;1&#xff09;队列的特点是&#xff08;   &#xff09;。 A&#xff09;先进后出 B&#xff09;先进先出 C&#xff09;任意位置进出 D&#xff0…

集群聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…

jedis基础入门

jedis采用key&#xff0c;value的形式保存数据&#xff0c;使用nosql sql和nosql的区别 一&#xff1a;入门案例 导入依赖 <dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>…

QWen2.5学习

配置环境 pip install transformers 记得更新一下&#xff1a;typing_extensions pip install --upgrade typing_extensions 安装modelscope modelscope/modelscope: ModelScope: bring the notion of Model-as-a-Service to life. 下载这个仓库的代码上传到服务器解压 推…

足球青训俱乐部管理后台系统(程序+数据库+报告)

基于SpringBoot的足球青训俱乐部管理后台系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块 编程语言&#xff1a;Java 数据库&#xff1a;MySQL 项目管理工具&#xff1a;Maven 前端技术&#xff1a;Vue 后端技术&#xff1a;SpringBoot…

MoneyPrinterTurbo - AI自动生成高清短视频

MoneyPrinterTurbo是一款基于AI大模型的开源软件&#xff0c;旨在通过一键操作帮助用户自动生成高清短视频。只需提供一个视频 主题或 **关键词** &#xff0c;就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐&#xff0c;然后合成一个高清的短视频。 ​ ​ 主要…

Cross-Inlining Binary Function Similarity Detection

注&#xff1a;在阅读该论文时顺便参考了作者团队的分享视频&#xff1a;【ICSE 2024论文预讲会-第二期-下午-哔哩哔哩】 https://b23.tv/XUVAPy3 在这个视频的末尾最后一个 一.introducion 计算下面两个函数的相似度&#xff1a; 查询函数&#xff1a;脆弱函数&#xff0c;重…

C++:哈希拓展-位图

目录 一.问题导入 二.什么是位图? 2.1如何确定目标数在哪个比特位? 2.2如何存放高低位 2.3位图模拟代码实现 2.3.1如何标记一个数 2.3.2如何重置标记 2.3.3如何检查一个数是否被标记 整体代码实现 标准库的Bitset 库中的bitset的缺陷 简单应用 一.问题导入 这道…

GCP : Memcache backed by Cloud Datastore

Memcache backed by Cloud Datastore 的用途主要体现在以下几个方面&#xff1a; 提高性能和可扩展性&#xff1a; Memcache 是一个高性能的分布式内存对象缓存系统&#xff0c;通常用于缓存数据库查询等操作&#xff0c;以减轻数据库负载&#xff0c;加快动态Web应用的响应速度…

【Python】问题解决:yaml文件加载得到字符串而不是字典

问题描述 最近需要使用python处理yaml文件&#xff0c;但使用过程中发现只能输出字符串的格式&#xff0c;而不是想要的字典格式。 基本使用 在python中想要读写yaml文件&#xff0c;可以安装使用第三方包pyyaml来实现&#xff0c;首先安装一下&#xff1a; pip install pyya…

时钟之Canvas+JS版

写在前面 上一篇介绍使用CSSJS方式实现&#xff0c;但元素太过单一。此篇将以HTML5的canvas标签结合JS来实现。 HTML代码 <canvas id"clock" width"300" height"300"></canvas> JS代码 var canvas null; var ctx null; var int…

shell脚本_创建执行与变量的定义与使用

PS:前言本章节讲解使用的系统为linux2024.1&#xff0c;基于Debian的Linux发行版。 一、什么是shell脚本&#xff1f; 1. 定义&#xff1a; 2. 主要特点&#xff1a; 3. shell脚本的基本结构 4. Shebang 二、创建执行 1.脚本的创建 2. 脚本的执行 2.1.chmod 2.2. 使用…

CSP/信奥赛C++语法基础刷题训练(11):洛谷P5743:猴子吃桃

CSP/信奥赛C语法基础刷题训练&#xff08;11&#xff09;&#xff1a;洛谷P5743&#xff1a;猴子吃桃 题目描述 一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半&#xff0c;又贪嘴多吃了一个&#xff1b;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n n n…