C++:websocketpp使用

ops/2024/11/15 6:01:40/

文章目录

  • 一、官网地址
  • 二、简介
  • 三、安装
  • 四、使用

一、官网地址

https://github.com/zaphoyd/websocketpp
参考
https://blog.csdn.net/qq_40344790/article/details/131207379
https://www.cnblogs.com/luckydml/p/11867319.html

二、简介

WebSocket++(简称WebSocketpp)是一个C++编写的WebSocket协议实现库,它提供了一个易于使用的接口,用于在C++应用程序中实现WebSocket客户端和服务器功能。WebSocket++支持WebSocket协议的最新标准,具有高度灵活性和可扩展性,适用于各种C++项目,包括网络服务器、实时通信应用程序等。

个人感受:WebSocketpp是一个成熟稳定的项目,相比于其他c++的websocket项目,更具有健全性。

三、安装

websocketpp库依赖boost_system,因此首先安装boost库:

apt-get install libboost-all-dev

下载websocketpp

git clone https://github.com/zaphoyd/websocketpp

编译安装

cd websocketcpp
mkdir build && cd build
cmake ..
make
make install

四、使用

由于我这里用于和ws服务端对接,所以我这里只用client;做了一个简单的封装。

#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/client.hpp>
#include <iostream>typedef websocketpp::client<websocketpp::config::asio_client> client;using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;typedef websocketpp::config::asio_client::message_type::ptr message_ptr;
class connection
{
public:void on_open(websocketpp::connection_hdl hdl){c.send(hdl, msg, websocketpp::frame::opcode::text);c.get_alog().write(websocketpp::log::alevel::app, "Tx: " + msg);}int init(std::string target_url,std::string first_message,std::function<void(websocketpp::connection_hdl, message_ptr)> message_handler){uri = target_url;msg = first_message;c.set_access_channels(websocketpp::log::alevel::all);c.clear_access_channels(websocketpp::log::alevel::frame_payload);c.clear_access_channels(websocketpp::log::alevel::frame_header);c.init_asio();// 设置自定义回调的处理函数c.set_message_handler(message_handler);c.set_open_handler(websocketpp::lib::bind(&connection::on_open, this, _1));c.start_perpetual();thread_ = websocketpp::lib::make_shared<websocketpp::lib::thread>(&client::run, &c);return 0;}int connect(){websocketpp::lib::error_code ec;client::connection_ptr con = c.get_connection(uri, ec);if (ec){std::cout << "could not create connection because: " << ec.message() << std::endl;return 0;}hdl_ = con->get_handle();c.connect(con);return 1;}// 发送消息方法void send_message(const std::string& message) {try {c.send(hdl_, message, websocketpp::frame::opcode::text);c.get_alog().write(websocketpp::log::alevel::app, "Tx: " + message);}catch (const websocketpp::exception& e) {// 捕获并处理异常std::cerr << "WebSocket Exception: " << e.what() << std::endl;}}// 发送二进制数据方法void send_binary_data(const std::vector<unsigned char>& data) {try {c.send(hdl_, data.data(), data.size(), websocketpp::frame::opcode::binary);c.get_alog().write(websocketpp::log::alevel::app, "Tx Binary Data");}catch (const websocketpp::exception& e) {// 捕获并处理异常std::cerr << "WebSocket Exception: " << e.what() << std::endl;}}void close(){try {c.close(hdl_, websocketpp::close::status::normal, "");}catch (const websocketpp::exception& e) {// 捕获并处理异常std::cerr << "WebSocket Exception: " << e.what() << std::endl;}}void terminate(){try {c.stop_perpetual();thread_->join();}catch (const websocketpp::exception& e) {// 捕获并处理异常std::cerr << "WebSocket Exception: " << e.what() << std::endl;}}
private:client c;websocketpp::lib::shared_ptr<websocketpp::lib::thread> thread_;websocketpp::connection_hdl hdl_;std::string uri;std::string  msg;
};

其他地方调用

#include "websocketpp.cpp"//1.设置回调函数
void reback_message(websocketpp::connection_hdl hdl, message_ptr msg)
{std::string message = msg->get_payload();websocketpp::lib::error_code ec;if (ec){std::cerr << "WebSocket Exception: " << ec.message().c_str() << std::endl;}else{std::cout<< "WebSocket 收到服务器信息: " << message.c_str() << std::endl;}
}//1.初始化实例
connection* conn= new connection();std::string url= "ws://127.0.0.1:6666";
std::string first_message = "websocket第一天初始化信息,可以不发,根据需求看代码";//2.初始化conn->init(url, first_message, reback_message);//3.连接到服务器 0连接失败1连接成功int res = conn->connect();//4.发送数据std::string date= "阿西吧,这是正常的文字";conn->send_message(date);// 准备要发送的数据std::vector<unsigned char> binary_data = {0x01, 0x02, 0x03, 0x04, 0x05};// 调用发送二进制数据的函数conn->send_binary_data(binary_data);//5.关闭conn->close();//6. 终止连接conn->terminate();

附送一个服务端代码

#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>#include <functional>typedef websocketpp::server<websocketpp::config::asio> server;class utility_server {
public:utility_server() {// 设置logm_endpoint.set_error_channels(websocketpp::log::elevel::all);m_endpoint.set_access_channels(websocketpp::log::alevel::all ^ websocketpp::log::alevel::frame_payload);// 初始化Asiom_endpoint.init_asio();// 设置消息回调为echo_handlerm_endpoint.set_message_handler(std::bind(&utility_server::echo_handler, this,std::placeholders::_1, std::placeholders::_2));}void echo_handler(websocketpp::connection_hdl hdl, server::message_ptr msg) {// 发送消息m_endpoint.send(hdl, msg->get_payload(), msg->get_opcode());}void run() {// 监听端口 6666m_endpoint.listen(6666);m_endpoint.start_accept();// 开始Asio事件循环m_endpoint.run();}
private:server m_endpoint;
};int main() {utility_server s;s.run();return 0;
}

http://www.ppmy.cn/ops/14887.html

相关文章

数据库1~4NF+ BCNF

基础概念 元组&#xff1a;表中的一行即为一个元组&#xff0c;对应存储文件中的一个记录值。数据表中一行数据。 属性&#xff1a;表中的列称为属性&#xff0c;每一列有一个属性名。属性名相当于记录中的数据项或字段值。码&#xff1a;具有唯一性的key。 候选码&#xff1a…

WebRTC的3A和SpeexDSP如何选择

SpeexDSP 是一个专门用于语音处理的开源库&#xff0c;它是从 Speex 项目中分离出来的。SpeexDSP 提供了多种音频处理功能&#xff0c;包括回声消除&#xff08;AEC&#xff09;、噪声抑制&#xff08;ANS&#xff09;、自动增益控制&#xff08;AGC&#xff09;以及声音的预处…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别 一、简单介绍 二、简单进行人脸训练与识别 1、LBPH…

[Spring Cloud] (4)搭建Vue2与网关、微服务通信并配置跨域

文章目录 前言gatway网关跨域配置取消微服务跨域配置 创建vue2项目准备一个原始vue2项目安装vue-router创建路由vue.config.js配置修改App.vue修改 添加接口访问安装axios创建request.js创建index.js创建InfoApi.js main.jssecurityUtils.js 前端登录界面登录消息提示框 最终效…

【C++风云录】辐射现代大数据景观:从Apache Arrow到Thrust的全方位探索

数据潮流中的引领者&#xff1a;Apache Arrow、Thrust和更多工具的综合介绍 前言 在当今数字化时代&#xff0c;大数据处理与分布式计算成为推动创新和发展的核心。本文将介绍几个关键的库和平台&#xff0c;从Apache Arrow的内存数据交换格式到Thrust的GPU并行计算库&#x…

华为笔试面试题

华为 1.static有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09; 1)在函数体&#xff0c;一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内&#xff08;但在函数体外&#xff09;&#xff0c;一个被声明为静态的变量可以被模块内所用函数…

Redis - Set 集合

前言 集合类型可保存多个字符串类型的元素&#xff0c;但和列表类型不同的是&#xff0c;集合中的元素之间是⽆序的&#xff08;顺序不重要&#xff0c;变换一下集合中的数据顺序&#xff0c;集合不会发生改变&#xff09; 的并且元素不允许重复 ⼀个集合中最多可以存储 2^32-1…

寻找两个正序数组的中位数

题目描述&#xff1a;给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 示例 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.00000 解释&#xff1a;合并数组 [1,2,3] &#…