muduo網絡庫2

?

????????Muduo網絡庫:底層實質上為Linux的epoll + pthread線程池,且依賴boost庫。 muduo的網絡設計核心為一個線程一個事件循環,有一個main Reactor負載accept連接,然后把連接分發到某個sub Reactor(采用輪詢的方式來選擇sub Reactor),該連接的所用操作都在那個sub Reactor所處的線程中完成。多個連接可能被分派到多個線程中,以充分利用CPU,Reactor poll的大小是固定的,根據CPU的數目確定。如果有過多的耗費CPU I/O的計算任務,可以提交到創建的ThreadPool線程池中專門處理耗時的計算任務。

1、 muduo網絡庫實例

muduo網絡庫實質為: epoll + 線程池,優點是能夠將網絡I/O的代碼和業務代碼分開。 而業務代碼主要分為:用戶的連接和斷開、用戶的可讀寫事件兩類。至于什么時候發生這些事件,由網絡庫進行上報,如何監聽這些事件,都是網絡庫所封裝好的,我們就可以快速進行項目開發。

muduo給用戶提供了兩個主要的類:
1、TcpServer:用于編寫服務器程序。
2、TcpClient:用于編寫客戶端程序。

如何配置muduo網絡庫請參考:?寫文章-CSDN創作中心

?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:9898ChatServer server(&loop, addr, "ChatServer");server.start(); // 啟動服務器loop.loop();    // 事件循環return 0;
}

?????????上面的代碼簡單的使用了muduo網絡庫實現了一個回顯服務器,我們可以在linux系統終端中使用telnet命令讓客戶端連接。

2、muduo網絡庫原理

????????Muduo 基于 Reactor 模式,核心是事件驅動。以下是其工作流程:

啟動服務器:

????????創建一個 EventLoop 實例作為主循環。
????????創建一個 TcpServer 實例,設置回調函數(連接、消息處理)。
????????調用 loop.loop() 開始事件循環。
事件監聽:

????????主線程監聽新連接。
????????每當有新連接到來,將其分配到工作線程處理。
事件分發與處理:

????????EventLoop 監聽事件,通過 Poller 檢測就緒的文件描述符。
????????調用 Channel 的回調函數處理事件。
數據收發與連接管理:

????????使用 TcpConnection 提供的接口收發數據。
????????在連接斷開時,自動清理資源。

3、經典的服務器設計模式Reactor模式

????????服務端程序架構基本上是一個大的while循環,程序阻塞在accept或poll函數上,等待被監控的socket描述符上出現預期的事件。事件到達后,accept或poll函數的阻塞解除,程序向下執行,根據socket描述符上出現的事件,執行read、write或錯誤處理。
整體架構如下圖所示:

????????muduo的軟件架構采用的也是Reactor模式,只是整個模式被分成多個類,并且支持以線程池的方式實現多線程并發處理,所以顯得有些復雜。整體架構如下圖所示:?

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

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

相關文章

WinSCP 連接到 Ubuntu 虛擬機

要使用 WinSCP 連接到 Ubuntu 虛擬機&#xff0c;一般采用 SFTP 或 SCP 協議進行文件傳輸。以下是詳細步驟&#xff1a; 1. 確保虛擬機網絡可訪問 首先&#xff0c;你的 Ubuntu 虛擬機需要允許外部訪問&#xff1a; 如果使用 NAT 網絡&#xff1a;需要設置端口轉發&#xff0…

redis小記

redis小記 下載redis sudo apt-get install redis-server redis基本命令 ubuntu16下的redis沒有protected-mode屬性&#xff0c;就算sudo啟動&#xff0c;也不能往/var/spool/cron/crontabs寫計劃任務&#xff0c;感覺很安全 #連接到redis redis-cli -h 127.0.0.1 -p 6379 …

Docker核心概念

容器介紹 Docker 是世界領先的軟件容器平臺&#xff0c;所以想要搞懂 Docker 的概念我們必須先從容器開始說起。 什么是容器? 先來看看容器較為官方的解釋 一句話概括容器&#xff1a;容器就是將軟件打包成標準化單元&#xff0c;以用于開發、交付和部署。 容器鏡像是輕量…

阿里云可觀測全面擁抱 OpenTelemetry 社區

作者&#xff1a;古琦 在云計算、微服務、容器化等技術重塑 IT 架構的今天&#xff0c;系統復雜度呈指數級增長。在此背景下&#xff0c;開源可觀測性技術已從輔助工具演變為現代 IT 系統的"數字神經系統"&#xff0c;為企業提供故障預警、性能優化和成本治理的全方…

2025年2月科技熱點深度解析:AI競賽、量子突破與開源革命

引言 2025年的科技領域持續呈現爆發式增長&#xff0c;AI大模型競爭白熱化、量子計算商業化加速、開源工具生態繁榮成為本月最受關注的議題。本文結合最新行業動態&#xff0c;從技術突破、商業布局到開發者生態&#xff0c;全面解析當前科技熱點&#xff0c;為讀者提供深度洞…

idea創建第一個springboot程序

說明&#xff1a; 我計劃用idea&#xff0c;創建第一個springboot程序&#xff0c;但是作為新手完全不會弄&#xff0c;今天我就親自嘗試一邊&#xff0c;并且出一期詳細&#xff0c;完美的教程&#xff0c;親測可以運行 step1. 點擊file &#xff0c; 選new&#xff0c; 選…

半導體芯片制造中 W CVD(鎢化學氣相沉積)

半導體芯片制造中 W CVD&#xff08;鎢化學氣相沉積&#xff09; 的 Nucleation 解析 在鎢&#xff08;W&#xff09;化學氣相沉積&#xff08;CVD&#xff09;工藝中&#xff0c;Nucleation&#xff08;成核&#xff09; 是沉積過程的初始階段&#xff0c;指鎢原子或分子在基…

Three.js 入門(輔助、位移、父子關系、縮放旋轉、響應式布局)

本篇主要學習內容 : 三維坐標系與輔助坐標系物體位移與父子元素物體的縮放與物體的旋轉設置響應式畫布與全屏控制 點贊 關注 收藏 學會了 本文使用 Three.js 的版本&#xff1a;171 基于 Vue3vite開發調試 1.三維坐標系與輔助坐標系 1.1) 導入three和軌道控制器 // 導入…

一鍵導出數據庫表到Excel

工作中&#xff0c;我們經常需要將數據庫表導出到Excel&#xff0c;通常我們會用數據庫編輯器之類的工具提供的導出功能來導出&#xff0c;但是它們的導出功能通常都比較簡單。 這篇文章將介紹一種簡單易用并且功能強大的導出方法。 新增導出 打開的盧導表工具&#xff0c;新…

CSS滾動條原理與自定義樣式指南,CSS滾動條樣式失效,滾動條樣式無效,-webkit-scrollbar無效,overflow不顯示滾動條

滾動內容形成的必要條件 CSS Overflow屬性解析 MDN官方文檔-Overflow屬性 菜鳥教程-Overflow屬性 overflow 屬性控制內容溢出元素框時在對應的元素區間內是否添加滾動條。 值描述visible默認值。內容不會被修剪&#xff0c;會呈現在元素框之外。hidden內容會被修剪&#xf…

【LLM】本地部署LLM大語言模型+可視化交互聊天,附常見本地部署硬件要求(以Ollama+OpenWebUI部署DeepSeekR1為例)

【LLM】本地部署LLM大語言模型可視化交互聊天&#xff0c;附常見本地部署硬件要求&#xff08;以OllamaOpenWebUI部署DeepSeekR1為例&#xff09; 文章目錄 1、本地部署LLM&#xff08;以Ollama為例&#xff09;2、本地LLM交互界面&#xff08;以OpenWebUI為例&#xff09;3、本…

溫濕度監控設備融入智慧物聯網

當醫院的溫濕度監控設備融入智慧物聯網&#xff0c;將會帶來許多新的體驗&#xff0c;可以幫助醫院溫濕度監控設備智能化管理&#xff0c;實現設備之間的互聯互通&#xff0c;方便醫院對溫濕度數據進行統一管理和分析。 添加智慧物聯網技術&#xff0c;實現對醫院溫濕度的實時…

在ubuntu如何安裝samba軟件?

我們在開發過程中&#xff0c;經常修改代碼&#xff0c;可以安裝samba文件來實現&#xff0c;把ubuntu的存儲空間指定為我們win上的一個磁盤&#xff0c;然后我們在或者磁盤里面創建.c文件&#xff0c;進行代碼修改和編寫。samba能將linux的文件目錄直接映射到windows&#xff…

[ComfyUI]官方已支持Skyreels混元圖生視頻,速度更快,效果更好(附工作流)

一、介紹 昨天有提到官方已經支持了Skyreels&#xff0c;皆大歡喜&#xff0c;效果更好一些&#xff0c;還有GGUF量化版本&#xff0c;進一步降低了大家的顯存消耗。 今天就來分享一下官方流怎么搭建&#xff0c;我體驗下來感覺更穩了一些&#xff0c;生成速度也更快&#xf…

B站pwn教程筆記-3

棧知識、部分保護措施 GDB顯示的棧地址有時候并不是可靠的地址&#xff0c;gdb也是用特殊的進程映像來拿地址的。且gdb默認關閉棧地址隨機化。但是&#xff0c;偏移量是沒有錯誤的。目前還沒學到咋解決 第一個棧幀是main函數棧幀&#xff0c;之前的一些系統函數什么的沒有棧幀…

Qt在Linux嵌入式開發過程中復雜界面滑動時卡頓掉幀問題分析及解決方案

Qt在Linux嵌入式設備開發過程中&#xff0c;由于配置較低&#xff0c;加上沒有GPU&#xff0c;我們有時候會遇到有些組件比較多的復雜界面&#xff0c;在滑動時會出現掉幀或卡頓的問題。要講明白這個問題還得從CPU和GPU的分工說起。 一、硬件層面核心問題根源剖析 CPU&#x…

Spring Boot 項目中,JDK 動態代理和 CGLIB 動態代理的使用

在 Spring Boot 項目中&#xff0c;JDK 動態代理和 CGLIB 動態代理都是實現 AOP (面向切面編程) 的重要技術。 它們的主要區別在于代理對象的生成方式和適用范圍。 下面詳細介紹它們的使用場景&#xff1a; 1. JDK 動態代理 (JDK Dynamic Proxy) 原理&#xff1a; JDK 動態代理…

OpenCV計算攝影學(2)圖像去噪函數denoise_TVL1()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 原始-對偶算法是用于解決特定類型變分問題&#xff08;即&#xff0c;尋找一個函數以最小化某個泛函&#xff09;的算法。特別地&#xff0c;圖像…

在 Windows 下的 Docker 中安裝 R語言

以下是在 Windows 系統的 Docker 中安裝 R 語言的詳細教程&#xff0c;包括 Docker 的安裝、配置以及如何在容器中運行 R 語言的步驟。 步驟 1&#xff1a;安裝 Docker 下載 Docker Desktop 訪問 Docker 官方網站&#xff1a;Docker Desktop: The #1 Containerization Tool for…

【數據挖掘在量化交易中的應用:特征發現與特征提取】

好的&#xff0c;我將撰寫一篇關于金融領域數據挖掘的技術博客&#xff0c;重點闡述特征發現和特征提取&#xff0c;特別是在量化交易中的應用。我會提供具體的實操步驟&#xff0c;并結合Python和TensorFlow進行代碼示例。 完成后&#xff0c;我會通知您進行查看。 數據挖掘…