当前位置: 首页 > news >正文

webSocket模块组件

对应的头文件

#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类的实现

// 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类的实现:

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

ConnectionManager类的实现:

// 连接管理器类
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类的实现:

// 异步任务队列类
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;
};

类函数的定义

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);}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 八股文之java基础
  • python大小写转换、驼峰大小写转换
  • NodeJS系列面试题
  • SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战
  • Quectel EM05-CE 模块测试
  • VScode通过Graphviz插件和dot文件绘制层次图,导出svg
  • 前端面试题整理
  • 揭开黑箱:目标检测中可解释性的重要性与实现
  • kail-linux如何使用NAT连接修改静态IP
  • Java面试题系列 - 第17天
  • FreeRTOS的互斥锁(互斥信号量)使用
  • grafana大坑,es找不到时间戳 | No date field named timestamp found
  • C语言 | Leetcode C语言题解之第240题搜索二维矩阵II
  • 【BUG】已解决:java.lang.reflect.InvocationTargetException
  • 设计模式-Git-其他
  • JS 中的深拷贝与浅拷贝
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 07.Android之多媒体问题
  • 2019年如何成为全栈工程师?
  • CentOS6 编译安装 redis-3.2.3
  • flutter的key在widget list的作用以及必要性
  • IndexedDB
  • JS实现简单的MVC模式开发小游戏
  • JS字符串转数字方法总结
  • oldjun 检测网站的经验
  • spring cloud gateway 源码解析(4)跨域问题处理
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 如何编写一个可升级的智能合约
  • 设计模式(12)迭代器模式(讲解+应用)
  • 线上 python http server profile 实践
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • PostgreSQL之连接数修改
  • ​configparser --- 配置文件解析器​
  • # Kafka_深入探秘者(2):kafka 生产者
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • # 数仓建模:如何构建主题宽表模型?
  • #{}和${}的区别是什么 -- java面试
  • #Ubuntu(修改root信息)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (07)Hive——窗口函数详解
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Matlab)使用竞争神经网络实现数据聚类
  • (二)Linux——Linux常用指令
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)基于IDEA的JAVA基础1
  • (一一四)第九章编程练习
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)memcache、redis缓存
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)视频码率,帧率和分辨率的联系与区别