webSocket模块组件

对应的头文件

cpp 复制代码
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
#include <nlohmann/json.hpp>
#include <boost/asio.hpp>
#include <queue>
#include <functional>
#include <memory>
#include <mutex>

using json = nlohmann::json;
using namespace websocketpp;

namespace asio = boost::asio;
using asio::io_context;

WebSocketServer类的实现

cpp 复制代码
// WebSocket服务器类
class WebSocketServer {
public:
    using server_type = server<config::asio>;
    WebSocketServer(asio::io_context& io_context)
        : m_server(io_context),
          m_io_context(io_context) {}

    void start(uint16_t port);
    void stop();
    void handle_message(server_type::connection_hdl hdl, server_type::message_ptr msg);

private:
    server_type m_server;
    asio::io_context& m_io_context;
};

MessageHandler类的实现:

cpp 复制代码
// 消息处理器类
class MessageHandler {
public:
    static void process_message(const json& message, std::function<void(json)> callback);
};

ConnectionManager类的实现:

cpp 复制代码
// 连接管理器类
class ConnectionManager {
public:
    void on_open(server_type::connection_hdl hdl);
    void on_close(server_type::connection_hdl hdl);

private:
    std::mutex m_mutex;
    std::unordered_map<server_type::connection_hdl, bool> m_connections;
};

TaskQueue类的实现:

cpp 复制代码
// 异步任务队列类
class TaskQueue {
public:
    void enqueue(std::function<void()> task);
    void run();

private:
    std::queue<std::function<void()>> m_queue;
    std::mutex m_mutex;
    std::condition_variable m_condition;
};

类函数的定义

cpp 复制代码
void WebSocketServer::start(uint16_t port) {
    m_server.init_asio();
    m_server.set_access_channels(websocketpp::log::alevel::all);
    m_server.clear_access_channels(websocketpp::log::alevel::frame_payload);
    m_server.listen(port);
    m_server.set_open_handler(std::bind(&ConnectionManager::on_open, &m_connection_manager, std::placeholders::_1));
    m_server.set_close_handler(std::bind(&ConnectionManager::on_close, &m_connection_manager, std::placeholders::_1));
    m_server.set_message_handler(std::bind(&WebSocketServer::handle_message, this, std::placeholders::_1, std::placeholders::_2));
    m_server.start_accept();
    m_io_context.run();
}

void WebSocketServer::stop() {
    m_io_context.stop();
}

void WebSocketServer::handle_message(server_type::connection_hdl hdl, server_type::message_ptr msg) {
    try {
        auto j = json::parse(msg->get_payload());
        MessageHandler::process_message(j, [this, hdl](const json& response) {
            m_server.send(hdl, response.dump(), websocketpp::frame::opcode::text);
        });
    } catch (std::exception& e) {
        // 错误处理
    }
}

void MessageHandler::process_message(const json& message, std::function<void(json)> callback) {
    // 根据消息类型处理消息
    if (message["type"] == "request") {
        // 调用相应的业务逻辑
        // ...

        // 假设我们得到了响应数据
        json response = {{"type", "response"}, {"data", "Hello World!"}};
        callback(response);
    }
}

void ConnectionManager::on_open(server_type::connection_hdl hdl) {
    std::lock_guard<std::mutex> lock(m_mutex);
    m_connections[hdl] = true;
}

void ConnectionManager::on_close(server_type::connection_hdl hdl) {
    std::lock_guard<std::mutex> lock(m_mutex);
    m_connections.erase(hdl);
}

void TaskQueue::enqueue(std::function<void()> task) {
    std::lock_guard<std::mutex> lock(m_mutex);
    m_queue.push(task);
    m_condition.notify_one();
}

void TaskQueue::run() {
    std::unique_lock<std::mutex> lock(m_mutex);
    while (true) {
        if (!m_queue.empty()) {
            auto task = std::move(m_queue.front());
            m_queue.pop();
            lock.unlock();
            task();
            lock.lock();
        } else {
            m_condition.wait(lock);
        }
    }
}
相关推荐
yuhaiqiang19 分钟前
上线一个人静态网站需要多少钱,难不难?
前端·后端·程序员
宸津-代码粉碎机23 分钟前
Jar热部署进阶实战|修复原生方案OOM与类冲突问题,生产级无BUG优化方案
java·大数据·服务器·开发语言·前端·人工智能·python
coder!mq24 分钟前
什么是泛型?有什么好处?
linux·运维·服务器·面试题·八股文
To_OC8 小时前
写了三遍 Todo List,我终于搞懂了 React 父子组件到底怎么通信
前端·javascript·react.js
勇往直前plus9 小时前
Vue3(篇一) 核心概念——响应式模板语法与组件基础
前端·javascript·vue.js
咩咩啃树皮9 小时前
第43篇:Vue3计算属性(computed)完全精讲——缓存机制、依赖计算、业务最优解
前端·vue.js·缓存
kirs_ur10 小时前
ECC & LDPC — SSD 的数据卫士
服务器·数据库·性能优化
徐小夕11 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
kyriewen13 小时前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js
Ivanqhz13 小时前
Rust &‘static str浅析
java·前端·javascript·rust