利用Muduo庫實現簡單且健壯的Echo服務器

一、muduo網絡庫主要提供了兩個類:

????????TcpServer:用于編寫服務器程序????????

????????TcpClient:用于編寫客戶端程序

二、三個重要的鏈接庫:

????????libmuduo_net、libmuduo_base、libpthread

三、muduo庫底層就是epoll+線程池,其好處是:

????????可以將網絡I/O代碼和業務代碼區分開,用戶只需關注業務,網絡的連接斷開、讀寫事件的上報與監控交給muduo庫

四、muduo庫對外暴露兩個業務接口:

? ? ? ? 1.用戶的連接與斷開

? ? ? ? 2.用戶的可讀寫事件

五、基于muduo網絡庫的服務器開發步驟

????????1.組合TcpServer對象

????????2.創建Eventloop事件循環對象的指針

????????3.明確Tcpserver構造函數需要什么參數,輸出Chatserver的構造函數

? ? ????????a.Tcpserver 主要提供兩個回調函數:setConnectionCallback與setMessageCallback

? ? ????????b.在構造函數中定義回調函數,在類中定義具體回調的函數的實現

????????4.在當前服務類的構造函數中,注冊處理連接的回調函數和處理讀寫事件的回調函數

????????5.設置合適的服務端線程數量,muduo庫會自己分配I/O線程和work線程

/*
muduo網絡庫主要提供了兩個類:TcpServer:用于編寫服務器程序
TcpClient:用于編寫客戶端程序三個重要的鏈接庫:
libmuduo_net、libmuduo_base、libpthreadmuduo庫底層就是epoll+線程池,其好處是:
可以將網絡I/O代碼和業務代碼區分開,用戶只需關注業務,網絡的連接斷開、讀寫事件的上報與監控交給muduo庫只暴露兩個業務接口:
1.用戶的連接與斷開
2.用戶的可讀寫事件*/
#include<muduo/net/TcpServer.h>
#include<muduo/net/EventLoop.h>
#include<functional>// #bind
#include<iostream>
#include<string>
using namespace std;
using namespace muduo;
using namespace muduo::net;
using namespace placeholders;/*
基于muduo網絡庫的服務器開發
1.組合TcpServer對象
2.創建Eventloop事件循環對象的指針
3.明確Tcpserver構造函數需要什么參數,輸出Chatserver的構造函數a.Tcpserver 主要提供兩個回調函數:setConnectionCallback與setMessageCallbackb.在構造函數中定義回調函數,在類中定義具體回調的函數的實現
4.在當前服務類的構造函數中,注冊處理連接的回調函數和處理讀寫事件的回調函數
5.設置合適的服務端線程數量,muduo庫會自己分配I/O線程和work線程*/
class ChatServer{
public://構造函數對TcpServer進行初始化,TcpServer沒有默認構造ChatServer(EventLoop *loop,//事件循環 reactorconst InetAddress &listenAddr,//ip + portconst string &nameArg)// 線程/server的名稱: _server(loop, listenAddr, nameArg), _loop(loop){//給服務器注冊用戶連接與斷開的回調函數,當監聽到連接/斷開時執行onConnection,具體如何監聽到是網絡庫的事情,無需用戶操心_server.setConnectionCallback(std::bind(&ChatServer::onConnection,this,_1));//相當于this.onConnection(TcpConnectionPtr&)//給服務器注冊用戶讀寫事件的回調函數_server.setMessageCallback(std::bind(&ChatServer::onMessage,this,_1,_2,_3));//設置服務器端的線程數量,muduo庫會自適應處理連接線程和工作線程的分配;CPU核數一般等于線程數//1個I/O線程,3個work線程_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)//接收到數據的時間信息{//echo服務器string buf=buffer->retrieveAllAsString();cout<<"recv: "<<buf<<"time: "<<time.toString()<<endl;conn->send(buf);}TcpServer _server;// #1EventLoop *_loop;// #2 看作epoll};int main(){EventLoop loop;//類似于創建epollInetAddress addr("127.0.0.1",6000);//本地回環地址,服務器僅接受來自本機的連接。適合在開發階段進行本地調試。ChatServer server(&loop,addr,"ChatServer");server.start();//epoll_ctl,listenfd加入epollloop.loop();//類似于epoll_wait,以阻塞的方式等待新用戶連接,已連接用戶的讀寫事件等return 0;
}

結果展示:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67672.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67672.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67672.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文件讀寫操作

寫入文本文件 #include <iostream> #include <fstream>//ofstream類需要包含的頭文件 using namespace std;void test01() {//1、包含頭文件 fstream//2、創建流對象ofstream fout;/*3、指定打開方式&#xff1a;1.ios::out、ios::trunc 清除文件內容后打開2.ios:…

C++編程語言:抽象機制:模板(Bjarne Stroustrup)

目錄 23.1 引言和概觀(Introduction and Overview) 23.2 一個簡單的字符串模板(A Simple String Template) 23.2.1 模板的定義(Defining a Template) 23.2.2 模板實例化(Template Instantiation) 23.3 類型檢查(Type Checking) 23.3.1 類型等價(Type Equivalence) …

定制Centos鏡像(二)

本章是對上篇文章的擴展&#xff1a; https://blog.csdn.net/qq_50247813/article/details/145286244 上篇文章學習了如何自定義鏡像安裝。這篇介紹如何在定制鏡像的時候安裝其他軟件&#xff1b; &#xff08;源文件參考上篇文章&#xff09; 根據上篇文章的步驟&#xff0c;…

【機器學習理論】樸素貝葉斯網絡

基礎知識&#xff1a; 先驗概率&#xff1a;對某個事件發生的概率的估計。可以是基于歷史數據的估計&#xff0c;可以由專家知識得出等等。一般是單獨事件概率。 后驗概率&#xff1a;指某件事已經發生&#xff0c;計算事情發生是由某個因素引起的概率。一般是一個條件概率。 …

Flutter 新春第一彈,Dart 宏功能推進暫停,后續專注定制數據處理支持

在去年春節&#xff0c;Flutter 官方發布了宏&#xff08;Macros&#xff09;編程的原型支持&#xff0c; 同年的 5 月份在 Google I/O 發布的 Dart 3.4 宣布了宏的實驗性支持&#xff0c;但是對于 Dart 內部來說&#xff0c;從啟動宏編程實驗開始已經過去了幾年&#xff0c;但…

計算機組成原理——存儲系統(一)

在人生的道路上&#xff0c;成功與失敗交織成一幅豐富多彩的畫卷。不論我們是面對勝利的喜悅&#xff0c;還是遭遇失敗的痛苦&#xff0c;都不能放棄對夢想的追求。正是在這種追求中&#xff0c;我們不斷地超越自我&#xff0c;不斷地突破自己的極限。只有勇往直前&#xff0c;…

前端知識速記:節流與防抖

前端知識速記&#xff1a;節流與防抖 什么是防抖&#xff1f; 防抖是一種控制事件觸發頻率的方法&#xff0c;通常用于處理用戶頻繁觸發事件的場景。防抖的核心思想是將多個連續觸發事件合并為一個事件&#xff0c;以減少執行次數。它在以下場景中特別有效&#xff1a; 輸入…

無人機圖傳模塊 wfb-ng openipc-fpv,4G

openipc 的定位是為各種模塊提供底層的驅動和linux最小系統&#xff0c;openipc 是采用buildroot系統編譯而成&#xff0c;因此二次開發能力有點麻煩。為啥openipc 會用于無人機圖傳呢&#xff1f;因為openipc可以將現有的網絡攝像頭ip-camera模塊直接利用起來&#xff0c;從而…

藍橋杯例題一

不管遇到多大的困難&#xff0c;我們都要堅持下去。每一次挫折都是我們成長的機會&#xff0c;每一次失敗都是我們前進的動力。路漫漫其修遠兮&#xff0c;吾將上下而求索。只有不斷努力奮斗&#xff0c;才能追逐到自己的夢想。不要害怕失敗&#xff0c;害怕的是不敢去嘗試。只…

【JavaEE進階】圖書管理系統 - 壹

目錄 &#x1f332;序言 &#x1f334;前端代碼的引入 &#x1f38b;約定前后端交互接口 &#x1f6a9;接口定義 &#x1f343;后端服務器代碼實現 &#x1f6a9;登錄接口 &#x1f6a9;圖書列表接口 &#x1f384;前端代碼實現 &#x1f6a9;登錄頁面 &#x1f6a9;…

【算法設計與分析】實驗8:分支限界—TSP問題

目錄 一、實驗目的 二、實驗環境 三、實驗內容 四、核心代碼 五、記錄與處理 六、思考與總結 七、完整報告和成果文件提取鏈接 一、實驗目的 掌握分支界限求解問題的思想&#xff1b;針對不同的問題&#xff0c;能夠利用分支界限法進行問題拆分和求解以及時間復雜度分析…

【3】阿里面試題整理

[1]. ES架構&#xff0c;如何進行路由以及選主 路由&#xff1a;在Elasticsearch&#xff08;ES&#xff09;中&#xff0c;默認的路由算法是基于文檔的_id。具體來說&#xff0c;Elasticsearch會對文檔的_id進行哈希計算&#xff0c;然后對分片數量取模&#xff0c;以確定該文…

【Linux】opencv在arm64上提示找不到libjasper-dev

解決opencv在arm64上提示找不到libjasper-dev的問題。 本文首發于?慕雪的寒舍 問題說明 最近我在嘗試編譯opencv&#xff0c;安裝依賴項libjasper1和libjasper-dev的時候就遇到了這個問題。在amd64平臺上&#xff0c;我們可以通過下面的命令安裝&#xff08;ubuntu18.04&…

【數據結構】_時間復雜度相關OJ(力扣版)

目錄 1. 示例1&#xff1a;消失的數字 思路1&#xff1a;等差求和 思路2&#xff1a;異或運算 思路3&#xff1a;排序&#xff0b;二分查找 2. 示例2&#xff1a;輪轉數組 思路1&#xff1a;逐次輪轉 思路2&#xff1a;三段逆置&#xff08;經典解法&#xff09; 思路3…

基于微信小程序的電子商城購物系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

【linux】Linux 常見目錄特性、權限和功能

目錄特性默認權限主要功能/用途/根目錄&#xff0c;所有目錄的起點755文件系統的頂層目錄&#xff0c;包含所有其他子目錄和文件/bin基礎二進制命令目錄&#xff08;系統啟動和修復必需的命令&#xff09;755存放所有用戶可用的基本命令&#xff08;如 ls, cp, bash 等&#xf…

docker直接運行arm下的docker

運行環境是樹莓派A 處理器是 arm32v6 安裝了docker&#xff0c;運行lamp 編譯安裝php的時候發現要按天來算&#xff0c;于是用電腦vm下的Ubuntu系統運行arm的docker 然后打包到a直接導入運行就可以了 第一種方法 sudo apt install qemu-user-static 導入直接運行就可以了…

計算機網絡一點事(22)

地址解析協議ARP ARP&#xff1a;查詢Mac地址 ARP表&#xff08;ARP緩存&#xff09;&#xff1a;記錄映射關系&#xff0c;一個數據結構&#xff0c;定期更新ARP表 過程&#xff1a;請求分組&#xff0c;響應分組 動態主機配置協議DHCP 分配IP地址&#xff0c;配置默認網關…

tomcat核心組件及原理概述

目錄 1. tomcat概述 1.1 概念 1.2 官網地址 2. 基本使用 2.1下載 3. 整體架構 3.1 核心組件 3.2 從web.xml配置和模塊對應角度 3.3 如何處理請求 4. 配置JVM參數 5. 附錄 1. tomcat概述 1.1 概念 什么是tomcat Tomcat是一個開源、免費、輕量級的Web服務器。 Tomca…

科技快訊 | OpenAI首次向免費用戶開放推理模型;特朗普與黃仁勛會面;雷軍回應“10后小學生深情表白小米SU7”

不用開口&#xff1a;谷歌 AI 幫你致電商家&#xff0c;價格、預約一鍵搞定 谷歌在1月30日推出Search Labs中的“Ask for Me”實驗性功能&#xff0c;用戶可利用AI代替自己致電商家咨詢價格和服務。該功能已與美汽車修理廠和美甲沙龍店合作&#xff0c;用戶需加入Search Labs并…