網絡版漢譯英服務(muduo)

文章目錄

  • 網絡版漢譯英服務(muduo)
    • muduo庫
      • muduo 庫是什么
      • muduo 庫常見接口介紹
        • muduo::net::EventLoop
        • muduo::net::TcpConnection
        • muduo::net::TcpServer
        • muduo::net::TcpClient
        • muduo::net::Buffer
    • 漢譯英服務
      • 服務端
      • 客戶端

網絡版漢譯英服務(muduo)

項目源碼:漢譯英服務

muduo庫

muduo 庫是什么

Muduo 由陳碩大佬開發,是一個基于非阻塞 IO事件驅動的 C++高并發 TCP 網絡編程庫。 它是一款基于主從 Reactor 模型的網絡庫,其使用的線程模型是 one loop per thread, 所謂 one loop per thread 指的是:

  • 一個線程只能有一個事件循環(EventLoop), 用于響應計時器和 IO 事件
  • 一個文件描述符只能由一個線程進行讀寫,換句話說就是一個 TCP 連接必須歸屬 于某個 EventLoop 管理

muduo 庫常見接口介紹

muduo::net::EventLoop
class EventLoop : noncopyable 
{ public:  //開始永久事件循環void loop(); //停止循環void quit(); TimerId runAt(Timestamp time, TimerCallback cb); TimerId runAfter(double delay, TimerCallback cb); TimerId runEvery(double interval, TimerCallback cb); void cancel(TimerId timerId); private: std::atomic<bool> quit_; std::unique_ptr<Poller> poller_; mutable MutexLock mutex_; std::vector<Functor> pendingFunctors_ GUARDED_BY(mutex_); 
}; 
muduo::net::TcpConnection
class TcpConnection : noncopyable, 
public std::enable_shared_from_this<TcpConnection> 
{ public:  TcpConnection(EventLoop* loop, const string& name, int sockfd, const InetAddress& localAddr, const InetAddress& peerAddr); //判斷是否在連接狀態bool connected() const { return state_ == kConnected; } bool disconnected() const { return state_ == kDisconnected; }  //發送數據void send(string&& message); // C++11 void send(const void* message, int len); void send(const StringPiece& message); // void send(Buffer&& message); // C++11 void send(Buffer* message); // this one will swap data //關閉連接void shutdown(); // NOT thread safe, no simultaneous calling void setContext(const boost::any& context) { context_ = context; } const boost::any& getContext() const { return context_; } boost::any* getMutableContext() { return &context_; } //設置回調函數void setConnectionCallback(const ConnectionCallback& cb) { connectionCallback_ = cb; } void setMessageCallback(const MessageCallback& cb) { messageCallback_ = cb; } private: enum StateE { kDisconnected, kConnecting, kConnected, kDisconnecting }; EventLoop* loop_; ConnectionCallback connectionCallback_; MessageCallback messageCallback_; WriteCompleteCallback writeCompleteCallback_; boost::any context_; 
}; 
muduo::net::TcpServer
typedef std::shared_ptr<TcpConnection> TcpConnectionPtr; 
typedef std::function<void (const TcpConnectionPtr&)> ConnectionCallback; 
typedef std::function<void (const TcpConnectionPtr&, Buffer*, Timestamp)> MessageCallback; class InetAddress : public muduo::copyable 
{ 
public: InetAddress(StringArg ip, uint16_t port, bool ipv6 = false); 
}; class TcpServer : noncopyable 
{ 
public: //端口是否復用enum Option { kNoReusePort, kReusePort, }; TcpServer(EventLoop* loop, const InetAddress& listenAddr, const string& nameArg, Option option = kNoReusePort);//設置線程數量void setThreadNum(int numThreads); //服務器啟動函數void start(); /// 當一個新連接建立成功的時候被調用 void setConnectionCallback(const ConnectionCallback& cb) { connectionCallback_ = cb; } /// 消息的業務處理回調函數---這是收到新連接消息的時候被調用的函數 void setMessageCallback(const MessageCallback& cb) { messageCallback_ = cb; } 
}; 
muduo::net::TcpClient
class TcpClient : noncopyable 
{ public: // TcpClient(EventLoop* loop); // TcpClient(EventLoop* loop, const string& host, uint16_t port); TcpClient(EventLoop* loop, const InetAddress& serverAddr, const string& nameArg); ~TcpClient(); // force out-line dtor, for std::unique_ptr members. //連接服務器void connect(); void disconnect();//關閉連接void stop(); //獲取客戶端對應的通信連接 Connection 對象的接口,發起 connect 后,有可能還沒有連接建立成功 TcpConnectionPtr connection() const { MutexLockGuard lock(mutex_); return connection_; } /// 連接服務器成功時的回調函數 void setConnectionCallback(ConnectionCallback cb) { connectionCallback_ = std::move(cb); } /// 收到服務器發送的消息時的回調函數 void setMessageCallback(MessageCallback cb) { messageCallback_ = std::move(cb); } private: EventLoop* loop_; ConnectionCallback connectionCallback_; MessageCallback messageCallback_; WriteCompleteCallback writeCompleteCallback_; TcpConnectionPtr connection_ GUARDED_BY(mutex_); 
}; /* 
需要注意的是,因為 muduo 庫不管是服務端還是客戶端都是異步操作, 
對于客戶端來說如果我們在連接還沒有完全建立成功的時候發送數據,這是不被允
許的。 
因此我們可以使用內置的 CountDownLatch 類進行同步控制 
*/ 
class CountDownLatch : noncopyable 
{ public: explicit CountDownLatch(int count);//配合client的connect()函數使用,在連接還沒有建立好時進行wait//直到client的連接回調函數被執行時,使用countDown()函數解除等待狀態void wait(){ MutexLockGuard lock(mutex_); while (count_ > 0) { condition_.wait();  } } void countDown(){ MutexLockGuard lock(mutex_); --count_; if (count_ == 0) { condition_.notifyAll(); } } int getCount() const; private: mutable MutexLock mutex_; Condition condition_ GUARDED_BY(mutex_); int count_ GUARDED_BY(mutex_); 
}; 
muduo::net::Buffer
class Buffer : public muduo::copyable 
{ public: static const size_t kCheapPrepend = 8; static const size_t kInitialSize = 1024; explicit Buffer(size_t initialSize = kInitialSize) : buffer_(kCheapPrepend + initialSize), readerIndex_(kCheapPrepend), writerIndex_(kCheapPrepend); //反序列化void retrieve(size_t len) void retrieveInt64() void retrieveInt32() void retrieveInt16() void retrieveInt8() string retrieveAllAsString() string retrieveAsString(size_t len)  private: std::vector<char> buffer_; size_t readerIndex_; size_t writerIndex_; static const char kCRLF[]; 
};

漢譯英服務

服務端

#include "include/muduo/net/TcpServer.h"
#include "include/muduo/net/TcpConnection.h"
#include "include/muduo/net/EventLoop.h"#include <iostream>
#include <functional>
#include <unordered_map>class TranslateServer
{public:TranslateServer(uint16_t port): _server(&_baseloop, muduo::net::InetAddress("0.0.0.0", port),"TranslateServer", muduo::net::TcpServer::kReusePort){// 將成員函數設置成server的回調函數_server.setConnectionCallback(std::bind(&TranslateServer::onConnection, this, std::placeholders::_1));_server.setMessageCallback(std::bind(&TranslateServer::onMessage, this, std::placeholders::_1,std::placeholders::_2, std::placeholders::_3));}void Start(){_server.start();_baseloop.loop(); }private:void onConnection(const muduo::net::TcpConnectionPtr &conn){// 建立新連接的回調函數if (conn->connected()){std::cout << "新連接建立成功!" << std::endl;}else{std::cout << "新連接退出" << std::endl;}}std::string translate(const std::string& req){static std::unordered_map<std::string,std::string> dictMap = {{"hello","你好"},{"Hello","你好"},{"吃了嗎","肉夾饃"}};auto it = dictMap.find(req);if(it == dictMap.end())return "沒找到";elsereturn it->second;}void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buffer, muduo::Timestamp){// 處理請求的回調函數//1.從buffer中拿到請求std::string req = buffer->retrieveAllAsString();//2.對請求進行處理std::string resp = translate(req);//3.發送響應conn->send(resp);}private:muduo::net::TcpServer _server;muduo::net::EventLoop _baseloop;
};int main()
{TranslateServer server(8088);server.Start();return 0;
}

客戶端

#include "include/muduo/net/TcpServer.h"
#include "include/muduo/net/TcpClient.h"
#include "include/muduo/net/TcpConnection.h"
#include "include/muduo/base/CountDownLatch.h"
#include "include/muduo/net/EventLoopThread.h"#include <iostream>
#include <functional>class TranslateClient
{
public:TranslateClient(const std::string &server_ip, int server_port): _latch(1), _client(_loopthread.startLoop(), muduo::net::InetAddress(server_ip,server_port), "TranslateClient"){_client.setConnectionCallback(std::bind(&TranslateClient::onConnection, this, std::placeholders::_1));_client.setMessageCallback(std::bind(&TranslateClient::onMessage, this, std::placeholders::_1,std::placeholders::_2, std::placeholders::_3));}// 阻塞式等待連接成功void connect(){_client.connect();_latch.wait();}bool send(const std::string &msg){//連接狀態正常再發送if(_conn->connected()){_conn->send(msg);return true;}return false;}private:// 建立連接成功后,喚醒上面的阻塞void onConnection(const muduo::net::TcpConnectionPtr &conn){if(conn->connected()){_latch.countDown();_conn = conn;}else{//連接關閉時的操作_conn.reset();}}void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buffer, muduo::Timestamp){std::cout<<"翻譯結果:"<<buffer->retrieveAllAsString()<<std::endl;}muduo::CountDownLatch _latch;muduo::net::EventLoopThread _loopthread;muduo::net::TcpClient _client;muduo::net::TcpConnectionPtr _conn;   
};int main()
{TranslateClient client("127.0.0.1", 8088);client.connect();while (1){std::string msg;std::cin >> msg;client.send(msg);}return 0;
} 

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

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

相關文章

在ArcMap中通過Python編寫自定義工具(Python Toolbox)實現點轉線工具

文章目錄 一、需求二、實現過程2.1、創建Python工具箱&#xff08;.pyt&#xff09;2.2、使用catalog測試代碼2.3、在ArcMap中使用工具 三、測試 一、需求 通過插件的形式將點轉線功能嵌入ArcMap界面&#xff0c;如何從零開始創建一個插件&#xff0c;包括按鈕的添加、工具的實…

C++之序列容器(vector,list,dueqe)

1.大體對比 在軟件開發的漫長歷程中&#xff0c;數據結構與算法始終占據著核心地位&#xff0c;猶如大廈的基石&#xff0c;穩固支撐著整個程序的運行。在眾多編程語言中&#xff0c;數據的存儲與管理方式各有千秋&#xff0c;而 C 憑借其豐富且強大的工具集脫穎而出&#xff…

【學習筆記】【DeepSeek AI 醫生】2-2 AI家庭醫生課程內容介紹

【DeepSeek AI 醫生】2-4 項目詳細分析及DeepSeek適用場景 一、Ollama部署二、可視化UI三、構建項目環境四、搭建項目架構五、Spring Al六、SSE服務端推送事件七、數據持久化八、線上部署 一、Ollama部署 Mac部署windows 部署ollama腳本、常用命令DeepSeek 提示詞、角色、適用…

STM32 I2C驅動開發全解析:從理論到實戰 | 零基礎入門STM32第五十步

主題內容教學目的/擴展視頻I2C總線電路原理&#xff0c;跳線設置&#xff0c;I2C協議分析。驅動程序與調用。熟悉I2C總線協議&#xff0c;熟練調用。 師從洋桃電子&#xff0c;杜洋老師 &#x1f4d1;文章目錄 引言一、I2C驅動分層架構二、I2C總線驅動代碼精析2.1 初始化配置&a…

Vercel Serverless

1. 引言 現代應用程序是為適應當前技術環境需求而設計的軟件&#xff0c;采用現代開發工具和實踐&#xff0c;針對云部署和可擴展性優化。它們由多個模塊化小組件組成&#xff0c;便于集成和縮放&#xff0c;具有高度的敏捷性和適應性&#xff0c;能快速響應用戶或業務需求變化…

國產操作系統之系統分區及分區的作用

國產操作系統之系統分區及分區的作用和掛載 Linux的系統分區跟Windows有著本質區別,在windows中大家知道c盤一般為系統盤,除c盤系統盤外,我們再分為D、E等文件存儲盤,而在Linux中雖然是以文件目錄著稱的系統,但思路也一樣的,比如針對系統分區中 /home、/var 和 /opt 等文…

字節碼是由什么組成的?

Java字節碼是Java程序編譯后的中間產物&#xff0c;它是一種二進制格式的代碼&#xff0c;可以在Java虛擬機&#xff08;JVM&#xff09;上運行。理解字節碼的組成有助于我們更好地理解Java程序的運行機制。 1. Java字節碼是什么&#xff1f; 定義 Java字節碼是Java源代碼經過…

微前端框架 Qiankun 的應用及問題分析

一、Qiankun 的核心應用場景與優勢 多技術棧共存與靈活集成 Qiankun 支持主應用與子應用使用不同技術棧&#xff08;如 Vue、React、Angular 等&#xff09;&#xff0c;通過 HTML Entry 方式接入子應用&#xff0c;無需深度改造子應用即可實現集成&#xff0c;降低了技術遷移成…

function uuid_generate_v4()不存在(二)

說明&#xff1a;之前代碼里用到了postgresql內嵌函數uid_generate_v4()生成記錄的主鍵&#xff0c;提示該函數不存在&#xff0c;寫了下面這篇博客記錄了一下&#xff0c;今天又發現了新的問題&#xff0c;于是補充了這篇博客。 function uuid_generate_v4()不存在&#xff0…

6. 機器人實現遠程遙控(具身智能機器人套件)

1. 啟動控制腳本 遠程作到 Raspberry Pi 中&#xff0c;并運行以下腳本&#xff1a; conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot登錄筆記本電腦上&#xff0c;同時運行以下腳本&#xff1a; conda ac…

【簡單的C++圍棋游戲開發示例】

C圍棋游戲開發簡單示例&#xff08;控制臺版&#xff09; ?核心代碼實現? #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 簡化棋盤為9x9?:ml-citation{ref"1" data"citationList&…

RK3568平臺(音頻篇)audio_policy_volumes_drc.xml解析

audio_policy_volumes_drc.xml 是 Android 系統中用于配置音頻策略和音量的 XML 文件。它定義了音頻流的音量曲線、動態范圍控制(DRC)參數以及音頻設備的音量設置。該文件通常位于 /vendor/etc/ 或 /system/etc/ 目錄下,是 Android 音頻框架的重要組成部分。 以下是對 audi…

如何下載安裝 PyCharm?

李升偉 整理 一、下載 PyCharm 訪問官網 打開 PyCharm 官網&#xff0c;點擊 "Download" 按鈕25。 版本選擇&#xff1a; 社區版&#xff08;Community&#xff09;&#xff1a;免費使用&#xff0c;適合個人學習和基礎開發。 專業版&#xff08;Professional&#…

leetcode day27 455+376

455 分發餅干 假設你是一位很棒的家長&#xff0c;想要給你的孩子們一些小餅干。但是&#xff0c;每個孩子最多只能給一塊餅干。 對每個孩子 i&#xff0c;都有一個胃口值 g[i]&#xff0c;這是能讓孩子們滿足胃口的餅干的最小尺寸&#xff1b;并且每塊餅干 j&#xff0c;都有…

HPC超算系列2——新手指南1

一&#xff0c;平臺簡介&#xff1a; 主要是官方手冊指南、B站視頻&#xff08;培訓視頻、軟件視頻&#xff09; 1&#xff0c;超算平臺架構&#xff1a; 和普通的家用電腦的架構不同&#xff0c; 主要區別在于&#xff1a;層次化的結構 &#xff08;1&#xff09;超算是有…

K8S單機部署

主線 :部署簡單的單節點k8s - sowler - 博客園 學習網址&#xff1a;為什么我不能獲取到鏡像&#xff0c;ImagePullBackoff | Kuboard docker鏡像源&#xff1a;https://chuxia.blog.csdn.net/article/details/145090710?spm1001.2101.3001.6650.3&utm_mediumdistribute…

web3區塊鏈

Web3 是指下一代互聯網&#xff0c;也被稱為“去中心化互聯網”或“區塊鏈互聯網”。它是基于區塊鏈技術構建的&#xff0c;旨在創建一個更加開放、透明和用戶主導的網絡生態系統。以下是關于 Web3 的一些關鍵點&#xff1a; ### 1. **核心概念** - **去中心化**&#xff1…

SQL Server核心知識總結

SQL Server核心知識總結 &#x1f3af; 本文總結了SQL Server核心知識點,每個主題都提供實際可運行的示例代碼。 一、SQL Server基礎精要 1. 數據庫核心操作 -- 1. 創建數據庫&#xff08;核心配置&#xff09; CREATE DATABASE 學生管理系統 ON PRIMARY (NAME 學生管理系統…

android 支持自定義布局、線程安全、避免內存泄漏的 Toast 工具類

支持自定義布局&#xff1a;可以靈活地顯示自定義樣式的 Toast。 線程安全&#xff1a;確保在主線程中顯示 Toast&#xff0c;避免崩潰。 避免內存泄漏&#xff1a;使用 ApplicationContext 和取消機制&#xff0c;防止內存泄漏問題。 工具類&#xff1a;作為一個通用的工具…

嵌入式人工智能應用-第6章 人臉檢測

嵌入式人工智能應用 人臉檢測 嵌入式人工智能應用1 人臉檢測1.1 CNN 介紹1.2 人臉檢測原理1.3 MTCNN介紹1.4 NCNN介紹2 系統安裝2.1 安裝依賴庫NCNN2.2 運行對應的庫3 總結1 人臉檢測 1.1 CNN 介紹 卷積神經網絡。卷積是什么意思呢?從數學上說,卷積是一種運算。它是我們學習…