施磊老師基于muduo網絡庫的集群聊天服務器(二)

文章目錄

  • Cmake簡單介紹
    • Cmake與Makefile
    • Cmake配置
    • CmakeLists.txt 編寫
    • 完整cmake例子
    • 文件夾雜亂問題
    • 多級目錄Cmake
    • vscode 極其推薦 的 cmake方式
  • Mysql環境與編程
    • mysql簡單使用
    • User表
    • Friend表
    • AllGroup表
    • GroupUser表
    • OfflineMessage表
  • 集群聊天項目工程目錄創建
  • 網絡模塊代碼Chatserver
    • 頭文件
    • 類函數定義文件
    • 主函數文件

Cmake簡單介紹

Cmake與Makefile

Makefile 在大項目里, 很難寫 出來, 推薦Cmake

  1. Makefile
    • 直接構建工具:定義編譯規則(如 gcc -o main main.c),由 make 直接執行。
    • 手動編寫:需指定每個文件的依賴和命令,適合小型項目。
    • 平臺差異:不同系統的 make 可能有兼容性問題。
  2. CMake
    • 構建系統生成器:通過 CMakeLists.txt 描述項目結構,自動生成平臺相關的構建文件(如 Makefile 或 IDE 工程)。
    • 跨平臺:一套配置適配多平臺(Linux/Mac/Windows)。
    • 高級功能:自動處理依賴、安裝規則等,適合中大型項目。

Cmake配置

直接手寫 cmake配置文件CMakeLists.txt, 命令行執行, 是可行的

vscode的cmake插件, 再寫 cmake 時 會有代碼提示----------> cmake 與 cmake tools

  1. cmake tools 設置里, 在對應的 本機或者 遠程 設置一下 cmake 的 build enviroment: 添加一下 cmake的 路徑(需要安裝 cmake)

    在這里插入圖片描述

CmakeLists.txt 編寫

  1. CMAKE_CXX_FLAGS 是 CMake 中用于設置 全局 C++ 編譯器選項 的變量,影響項目中所有 C++ 目標的編譯行為。

  2. 在 CMake 中,set() 命令用于 定義或修改變量,是 CMake 腳本中最基礎且重要的命令之一

    set(變量名 值)  # 定義普通變量
    
  3. 在 CMake 中,add_executable 是一個核心命令,用于定義可執行文件目標

    add_executable(<目標名稱> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] <源文件列表>)
    

    最主要的是 目標名稱 和 源文件列表

    例子:

    #單文件
    add_executable(hello_world main.cpp)#多文件
    add_executable(my_app main.cpp utils.cpp include/utils.h
    )#條件編譯--不同平臺
    if(WIN32)add_executable(my_win_app WIN32 win_main.cpp)
    else()add_executable(my_win_app main_unix.cpp)
    endif()#使用變量組織源文件
    set(APP_SOURCES src/main.cpp src/core.cpp
    )
    add_executable(my_app ${APP_SOURCES})
    
  4. 在 CMake 中,target_link_libraries 是一個關鍵命令,用于為指定的目標(可執行文件或庫)鏈接依賴庫。它管理目標的所有鏈接依賴關系,是現代 CMake 推薦的做法。 — 更多使用, 多見多總結 — 老師pdf也有很多, 多看

    target_link_libraries(<目標名稱><PRIVATE|PUBLIC|INTERFACE> <庫1> [<庫2>...][<PRIVATE|PUBLIC|INTERFACE> <庫3>...]
    )
    
  5. aux_source_directory 是 CMake 中一個 用于自動收集源文件 的命令,但現代 CMake 已不再推薦使用它。

    aux_source_directory(<目錄路徑> <變量名>)
    

    為什么不推薦使用?

    1. 不會自動檢測新增文件
      需要手動重新運行 CMake 才能識別新添加的源文件。
    2. 包含無關文件風險
      可能意外包含測試文件、備份文件(如 main.cpp.bak)。
    3. 破壞構建系統的確定性
      隱式文件收集會導致構建行為不可預測。
    4. 與現代 CMake 理念沖突
      現代 CMake 強調顯式聲明源文件(target_sources())。

    推薦使用 set 手動, 很麻煩

完整cmake例子

cmake_minimum_required(VERSION 3.0)
project(main) #工程名# 配置編譯選項
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)# 配置頭文件搜索路徑
include_directories()
# 配置庫文件搜索路徑
link_directories()#設置需要編譯的 源文件列表
set(SRC_LIST ./nuduo_server.cpp)#把 . 指定路徑下的 所有源文件名字 放入變量名--不用手動一個個輸入
# aux_source_directory(. SRC_LIST) #暫時不用#生成可執行文件
add_executable(server ${SRC_LIST})# 表示server 這個目標程序 需要鏈接的 庫
target_link_libraries(server muduo_net muduo_base pthread)

然后 先執行 cmake .----> 得到 makefile文件 —> 再make 即可

文件夾雜亂問題

直接 使用上面的 構建, 生成許多雜亂的 文件夾

一般 開源性代碼 會有以下結構:

目錄/文件用途描述文件類型示例
bin/存放生成的可執行文件(二進制文件)myapp, myapp.exe
lib/存放編譯生成的庫文件libmylib.a, mylib.so
include/存放項目的公共頭文件utils.h, config.hpp
src/存放項目的主要源代碼文件main.cpp, module.c
build/存放CMake生成的構建文件Makefile, build.ninja
example/存放示例代碼或測試用例demo.cpp, test_case.py
thirdparty/存放第三方依賴庫或源碼googletest/, boost/
CMakeLists.txtCMake的主配置文件-
autobuild.sh自動化構建腳本-
  1. 在 CMake 中,EXECUTABLE_OUTPUT_PATH 是一個用于設置可執行文件輸出路徑的全局變量。它控制通過 add_executable() 生成的可執行文件的存放位置。

    在 CMake 中,PROJECT_SOURCE_DIR 是一個預定義變量,表示當前項目的根目錄路徑(即包含頂層 CMakeLists.txt 的目錄)。

    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
    
  2. 建立 build 文件, 進入build 進行 cmake .., 之前的 雜亂的文件夾就在這個目錄里了, 并且 可執行文件 在bin目錄里

  3. 完整如下:

    cmake_minimum_required(VERSION 3.0)
    project(main) #工程名# 配置編譯選項
    set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)# 配置頭文件搜索路徑
    include_directories()
    # 配置庫文件搜索路徑
    link_directories()#設置需要編譯的 源文件列表
    set(SRC_LIST ./nuduo_server.cpp)# 設置可執行文件最終目錄
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)# 設置庫文件最終目錄
    set(LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)#把 . 指定路徑下的 所有源文件名字 放入變量名--不用手動一個個輸入
    # aux_source_directory(. SRC_LIST) #暫時不用#生成可執行文件
    add_executable(server ${SRC_LIST})# 表示server 這個目標程序 需要鏈接的 庫
    target_link_libraries(server muduo_net muduo_base pthread)

多級目錄Cmake

內部的CMakeLists.txt 不需要 前5行, 這是 cmake的 入口
把這5行 放入 最外部的 CMakeLists.txt, 并且 加入 指定搜索的 子目錄 即可

cmake_minimum_required(VERSION 3.0)
project(main) #工程名# 配置編譯選項
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)# 指定搜索的 子目錄
add_subdirectory(testmuduo)

vscode 極其推薦 的 cmake方式

vscode 插件 會有圖標, 使用這個 進行 編譯------> 即完成, 并會 外部 自動構建 build 文件

在這里插入圖片描述

注意: 僅會自動構建 build 文件, bin 文件 還需要手動指定, 在 內部CMakeLists.txt 里 進行

VS Code CMake 插件的自動化機制

(1) 自動行為說明

  • 自動生成 build/ 目錄
    插件默認會在項目根目錄下創建 build/(或用戶配置的路徑),自動處理以下內容:

    mkdir -p build && cd build
    cmake .. -DCMAKE_BUILD_TYPE=Debug  # 自動選擇編譯器工具鏈
    
  • 實時更新
    插件會監控 CMakeLists.txt 和源碼文件的修改,但不會實時構建,僅在以下情況觸發:

    • 手動點擊編譯按鈕
    • 保存文件時(若開啟 "cmake.configureOnEdit": true
    • 執行調試/運行任務時

(2) 優勢

  • 無需手動輸入 CMake 命令
  • 自動匹配編譯器工具鏈(通過 CMake: Scan for Kits
  • 與 VS Code 調試功能深度集成

Cmake 到此為止-----> 更多內容 見 pdf

Mysql環境與編程

登錄 之前寫過, 略

mysql 有課程, 建議看一下 — > 必須要了解 數據庫 mysql !!!

mysql簡單使用

  1. 創建數據庫:

    CREATE DATABASE database_name;   // 大小寫都行
    
  2. 選擇要操作的 數據庫:

    use database_name; 
    
  3. 查看默認的字符編碼:

    show variables like "char%";
    

    修改表的字符編碼:alter table user default character set utf8;
    修改屬性的字符編碼:alter table user modify column name varchar(50) character set utf8;

  4. 從已有的 sql文件讀取, 需要先創建 一個數據庫, 并且選中它進行操作, 再 source ./<..>.sql

  5. 根據表, 在mysql里 進行創建. — 具體表

    User表

    字段名稱字段類型字段說明約束
    idINT用戶idPRIMARY KEY, AUTO_INCREMENT
    nameVARCHAR(50)用戶名NOT NULL, UNIQUE
    passwordVARCHAR(50)用戶密碼NOT NULL
    stateENUM(‘online’,‘offline’)當前登錄狀態DEFAULT ‘offline’

    Friend表

    字段名稱字段類型字段說明約束
    useridINT用戶idNOT NULL, 聯合主鍵
    friendidINT好友idNOT NULL, 聯合主鍵

    AllGroup表

    字段名稱字段類型字段說明約束
    idINT組idPRIMARY KEY, AUTO_INCREMENT
    groupnameVARCHAR(50)組名稱NOT NULL, UNIQUE
    groupdescVARCHAR(200)組功能描述DEFAULT ‘’

    GroupUser表

    字段名稱字段類型字段說明約束
    groupidINT組idNOT NULL, 聯合主鍵
    useridINT組員idNOT NULL, 聯合主鍵
    grouproleENUM(‘creator’,‘normal’)組內角色DEFAULT ‘normal’

    OfflineMessage表

    字段名稱字段類型字段說明約束
    useridINT用戶idNOT NULL
    messageVARCHAR(500)離線消息(存儲Json字符串)NOT NULL

集群聊天項目工程目錄創建

略—> bin build include src thirdparty 文件夾

外層 CMakeLists.txt 和 src 的兩層 CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project(main) #工程名# 配置編譯選項
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)# 配置最終的可執行文件輸出的路徑
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)# 配置 頭文件 搜索路徑
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/include/server)# 加載子目錄  src   既然進去, 就有 CMakeLists.txt
add_subdirectory(src)
# 加載子目錄  src   既然進去, 就有 CMakeLists.txt
add_subdirectory(server)
# 所有源文件
aux_source_directory(. SRC_LIST)
# 生成可執行
add_executable(Chatserver ${SRC_LIST})# 鏈接庫
target_link_libraries(Chatserver muduo_net muduo_base pthread)

網絡模塊代碼Chatserver

hpp文件 寫聲明

源文件 進行定義使用

頭文件

include/chatserver.hpp

#ifndef CHATSERVER_H
#define CHATSERVER_H#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
using namespace muduo;
using namespace muduo::net;// 聊天服務器主類
class ChatServer
{
public:// 初始化聊天服務器對象ChatServer(EventLoop *loop,const InetAddress &listenAddr,const string &nameArg);// 啟動服務void start();private:// 上報連接 相關信息的回調void onConnect();// 上報讀寫事件相關信息的 回調void onMessage();TcpServer _server; // 組合的muduo庫, 實現服務器功能的 類對象EventLoop *_loop;  // 指向事件循環對象的 指針
};#endif 

類函數定義文件

src/server/chatserver.cpp

不完整, 回調內部 還沒寫

#include "chatserver.hpp"#include <functional>
using namespace std;
using namespace placeholders;// 類外 定義成員函數
ChatServer::ChatServer(EventLoop *loop,const InetAddress &listenAddr,const string &nameArg): _server(loop, listenAddr, nameArg), _loop(loop)
{// 注冊連接回調函數_server.setConnectionCallback(std::bind(&ChatServer::onConnect, this, _1));// 注冊消息回調_server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));// 設置線程數_server.setThreadNum(4);
}void ChatServer::start()
{_server.start();
}void ChatServer::onConnect(const TcpConnectionPtr& conn)
{}void ChatServer::onMessage(const TcpConnectionPtr& conn,Buffer* buf,Timestamp time)
{   }

主函數文件

src/server/main.cpp

#include "chatserver.hpp"
#include <iostream>
using namespace std;int main()
{EventLoop loop;InetAddress addr("127.0.0.1", 6000);ChatServer server(&loop, addr, "ChatServer");server.start();loop.loop();return 0;
}

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

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

相關文章

4.18---緩存相關問題(操作原子性,擊穿,穿透,雪崩,redis優勢)

為什么要用redis做一層緩存&#xff0c;相比直接查mysql有什么優勢&#xff1f; 首先介紹Mysql自帶緩存機制的問題&#xff1a; MySQL 的緩存機制存在一些限制和問題,它自身帶的緩存功能Query Cache只能緩存完全相同的查詢語句&#xff0c;對于稍有不同的查詢語句&#xff0c…

健康養生指南

在快節奏的現代生活中&#xff0c;健康養生成為人們關注的焦點。它不僅關乎身體的強健&#xff0c;更是提升生活質量、預防疾病的關鍵。掌握科學的養生方法&#xff0c;能讓我們在歲月流轉中始終保持活力。 飲食是健康養生的基礎。遵循 “均衡膳食” 原則&#xff0c;每日飲食需…

#去除知乎中“鹽選”付費故事

添加油猴腳本&#xff0c;去除知乎中“鹽選”付費故事 // UserScript // name 鹽選內容隱藏腳本 // namespace http://tampermonkey.net/ // version 0.2 // description 自動隱藏含有“鹽選專欄”或“鹽選”文字的回答卡片 // author YourName // mat…

如何防止接口被刷

目錄 &#x1f6e1;? 一、常見的防刷策略分類 &#x1f527; 二、技術實現細節 ? 1. 基于 IP 限流 ? 2. 給接口加驗證碼 ? 3. 使用 Token 限制接口訪問權限 ? 4. 給接口加冷卻時間&#xff08;驗證碼類經典&#xff09; ? 5. 使用滑動窗口限流算法&#xff08;更精…

github 項目遷移到 gitee

1. 查看遠程倉庫地址 git remote -v 2. 修改遠程倉庫地址 確保 origin 指向你的 Gitee 倉庫&#xff0c;如果不是&#xff0c;修改遠程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…

探索大語言模型(LLM):目標、原理、挑戰與解決方案

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言語言模型的目標語言模型的數學表示語言模型面臨的挑戰解決參數量巨大的方法1. 馬爾可夫假設2. 神經網絡語言模型3.自監督學習4. 分布式表示 腦圖總結 前言 在自…

Kubernetes》》k8s》》Namespace

Namespace 概述 Namespace&#xff08;命名空間&#xff09; 是 Kubernetes 中用于邏輯隔離集群資源的機制&#xff0c;可將同一集群劃分為多個虛擬環境&#xff0c;適用于多團隊、多項目或多環境&#xff08;如開發、測試、生產&#xff09;的場景。 核心作用&#xff1a; 資…

FFUF指南

ffuf 的核心功能&#xff1a; 目錄/文件發現&#xff1a; 通過暴力破解&#xff08;使用字典&#xff09;探測目標網站的隱藏目錄或文件&#xff0c;例如&#xff1a; ffuf -w /path/to/wordlist.txt -u http://target.com/FUZZ 子域名枚舉&#xff1a; 通過模糊測試發現目標…

Qt通過ODBC和QPSQL兩種方式連接PostgreSQL或PolarDB PostgreSQL版

一、概述 以下主要在Windows下驗證連接PolarDB PostgreSQL版&#xff08;阿里云兼容 PostgreSQL的PolarDB版本&#xff09;。Linux下類似&#xff0c;ODBC方式則需要配置odbcinst.ini和odbc.ini。 二、代碼 以下為完整代碼&#xff0c;包含兩種方式連接數據庫&#xff0c;并…

為什么浮點數會搞出Infinity和NAN兩種類型?浮點數的底層原理?IEEE 754標準揭秘?

目錄 什么是NAN? 不同編程語言的NaN 為什么浮點數會搞出Infinity和NAN兩種類型? 浮點數 小數點位置浮動的原因 浮點數和整數 浮點數指令 精確性 浮點數的類型 為什么叫浮點數? 小數點位置浮動的原因 IEEE 754起源于intel公司 IEEE 754標準 編程語言的浮點數都…

Node.js Session 原理簡單介紹 + 示例代碼

目錄 ? Session 原理簡要說明 &#x1f9e9; 示例項目 - 使用 Node.js Express 實現簡單 Session 登錄 &#x1f4c1; 文件結構 &#x1f539; server.js (JavaScript) &#x1f538; index.html (HTML) ?? 程序運行步驟 ? 程序運行效果 &#x1f3af; 總結 在 We…

實戰交易策略 篇十六:獵豹阿杜打板交易策略

文章目錄 系列文章狙擊漲停板的十大要訣炒股大成者,必具“三商”系列文章 實戰交易策略 篇一:奧利弗瓦萊士短線交易策略 實戰交易策略 篇二:杰西利弗莫爾股票大作手操盤術策略 實戰交易策略 篇三:333交易策略 實戰交易策略 篇四:價值投資交易策略 實戰交易策略 篇五:底部…

Opentelemetry 項目解讀

Opentelemetry 解讀 1. 什么是 Opentelmetry Ot 統一了可觀測的三個重要維度&#xff1a;分別是 Trace&#xff0c;Log&#xff0c;Metrics。 在沒有 ot 之前&#xff0c;不同維度的可觀測組件都是不同的&#xff1a; 在 Trace 領域&#xff1a;skywalking 一直很受歡迎&am…

與終端同居日記:Linux指令の進階撩撥手冊

前情提要&#xff1a; 當你和終端的關系從「早安打卡」進階到「深夜代碼同居」&#xff0c;那些曾經高冷的指令開始展露致命の反差萌—— man 是那個永遠在線的鋼鐵直男說明書&#xff0c;只會說&#xff1a;"想懂我&#xff1f;自己看文檔&#xff01;"&#xff08…

Java 開發玩轉 MCP:從 Claude 自動化到 Spring AI Alibaba 生態整合

摘要 本文以原理與示例結合的形式講解 Java 開發者如何基于 Spring AI Alibaba 框架玩轉 MCP&#xff0c;主要包含以下內容。 1. 一些 MCP 基礎與快速體驗&#xff08;熟悉的讀者可以跳過此部分&#xff09; 2. 如何將自己開發的 Spring 應用發布為 MCP Server&#xff0c;驗…

【面試向】欠擬合和過擬合、正則化(Regularization)

訓練集、驗證集和測試集泛化誤差過擬合&#xff08;Overfitting&#xff09;和 欠擬合&#xff08;Underfitting&#xff09;如何區分過擬合和欠擬合&#xff1f;欠擬合 —— 在訓練集和驗證集上都表現很差過擬合 —— 在訓練集上表現很好&#xff0c;但在驗證集或測試集上表現…

ClawCloud的免費空間(github用戶登錄可以獲得$5元/月的免費額度)

免費的空間 Welcome to ClawCloud Lets create your workspace 官網&#xff1a;ClawCloud | Cloud Infrastructure And Platform for Developers 區域選擇新加坡 然后這個頁面會變成新加坡區域&#xff0c;再按一次確定&#xff0c;就創建好了工作臺。 初始界面&#xff0…

Spring Boot + Caffeine:打造高性能緩存解決方案

1. 引言 1.1 緩存的重要性 緩存是提升系統性能的關鍵技術之一,通過將頻繁訪問的數據存儲在內存中,減少對數據庫或其他外部系統的訪問次數,從而降低延遲并提高吞吐量。 緩存的基本概念:緩存是一種臨時存儲機制,用于快速訪問常用數據。緩存在提升系統性能中的作用:減少數…

每天學一個 Linux 命令(24):chattr

??可訪問網站查看,視覺品味拉滿: http://www.616vip.cn/24/index.html 每天學一個 Linux 命令(24):chattr 命令簡介 chattr(Change Attribute)用于修改文件或目錄的底層屬性(如防刪除、防修改),這些屬性比普通權限更嚴格。常用于保護重要文件或優化文件系統行為。…

【java 13天進階Day04】常用API、正則表達式,泛型、Collection集合API

Math類的使用。 Math用于做數學運算。Math類中的方法全部是靜態方法&#xff0c;直接用類名調用即可。方法&#xff1a; public static int abs(int a) 獲取參數a的絕對值public static double ceil(double a) 向上取整public static double floor(double a) 向下取整public s…