boost::beast websocket 实例
环境:ubuntu
1. 安装boost
sudo apt install -y libboost-all-dev
2. Server端
#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include <iostream>
#include <thread>namespace beast = boost::beast; // 从 Boost.Beast 中导入命名空间
namespace websocket = beast::websocket;
namespace net = boost::asio;
using tcp = boost::asio::ip::tcp;class WebSocketServer {
public:WebSocketServer(net::io_context& ioc, short port): acceptor_(ioc, tcp::endpoint(tcp::v4(), port)), socket_(ioc) {}void start() {accept();}private:void accept() {acceptor_.async_accept(socket_,[this](beast::error_code ec) {if (!ec) {std::cout << "New connection established!" << std::endl;handleWebSocket(std::move(socket_));}// 继续接收下一个连接accept();});}void handleWebSocket(tcp::socket socket) {try {// 创建 WebSocket 流并进行握手websocket::stream<tcp::socket> ws(std::move(socket));ws.accept();std::cout << "WebSocket handshake completed." << std::endl;beast::flat_buffer buffer;while (true) {// 读取消息ws.read(buffer);std::string message = beast::buffers_to_string(buffer.data());std::cout << "Received: " << message << std::endl;// 回显消息ws.write(net::buffer(message));// 清空缓冲区,准备接收下一条消息buffer.clear();}} catch (std::exception& e) {std::cerr << "WebSocket Error: " << e.what() << std::endl;}}tcp::acceptor acceptor_;tcp::socket socket_;
};int main() {try {net::io_context ioc;short port = 8080; // 服务器端口WebSocketServer server(ioc, port);std::cout << "WebSocket server listening on port " << port << "..." << std::endl;// 启动服务器server.start();// 运行 IO 上下文ioc.run();} catch (std::exception& e) {std::cerr << "Server Error: " << e.what() << std::endl;}return 0;
}
代码解析:
-
WebSocketServer类:- 在构造函数中,设置服务器的监听端口(
tcp::acceptor)。 start方法启动accept()以异步接受新的连接。- 每个连接的 WebSocket 流通过
websocket::stream<tcp::socket>来处理。 - 在
handleWebSocket中,读取客户端发送的消息,回显给客户端。
- 在构造函数中,设置服务器的监听端口(
-
main函数:- 创建
net::io_context对象,该对象是 Boost.Asio 的核心,用于管理异步操作。 - 创建并启动 WebSocket 服务器,监听端口
8080。 - 调用
ioc.run()来启动 IO 服务的事件循环,保持服务器运行。
- 创建
运行效果:
-
服务器会监听
8080端口。 -
当客户端连接时,服务器接收客户端发送的消息并回显。
例如,当客户端发送消息
"Hello from client 0"时,服务器会接收到该消息并回传"Hello from client 0"。
3. Client 端
#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include <iostream>
#include <thread>
#include <vector>namespace beast = boost::beast; // 从 Boost.Beast 中导入命名空间
namespace websocket = beast::websocket;
namespace net = boost::asio;
using tcp = boost::asio::ip::tcp;class WebSocketClient {
public:WebSocketClient(net::io_context& ioc, const std::string& host, const std::string& port): resolver_(ioc), ws_(ioc) {try {// 解析域名auto const results = resolver_.resolve(host, port);// 连接到 WebSocket 服务器net::connect(ws_.next_layer(), results.begin(), results.end());// 执行 WebSocket 握手ws_.handshake(host, "/");std::cout << "Connected to " << host << ":" << port << std::endl;} catch (std::exception& e) {std::cerr << "WebSocket Connection Error: " << e.what() << std::endl;}}void sendMessage(const std::string& message) {try {ws_.write(net::buffer(message));std::cout << "Sent: " << message << std::endl;beast::flat_buffer buffer;ws_.read(buffer);std::cout << "Received: " << beast::buffers_to_string(buffer.data()) << std::endl;} catch (std::exception& e) {std::cerr << "WebSocket Error: " << e.what() << std::endl;}}private:tcp::resolver resolver_;websocket::stream<tcp::socket> ws_;
};// 启动多个 WebSocket 客户端
void startClients(int num_clients, const std::string& host, const std::string& port) {net::io_context ioc;std::vector<std::thread> threads;for (int i = 0; i < num_clients; ++i) {threads.emplace_back([&, i] {WebSocketClient client(ioc, host, port);client.sendMessage("Hello from client " + std::to_string(i));});}for (auto& t : threads) {t.join();}
}int main() {std::string host = "127.0.0.1"; // WebSocket 服务器地址std::string port = "8080"; // WebSocket 服务器端口int num_clients = 5; // 需要并发的 WebSocket 连接数startClients(num_clients, host, port);return 0;
}
关键点
- 使用
boost::asio::io_context管理异步操作。 - 每个 WebSocket 连接由一个独立线程维护。
- 连接后发送消息并接收响应。
代码解析
-
WebSocketClient类:- 解析服务器地址并连接 (
resolver_.resolve和net::connect)。 - 进行 WebSocket 握手 (
ws_.handshake)。 - 发送消息 (
ws_.write) 并读取服务器响应 (ws_.read)。
- 解析服务器地址并连接 (
-
startClients函数:- 通过
std::vector<std::thread>创建多个线程,每个线程都运行一个 WebSocket 客户端实例。 - 每个客户端连接到服务器后,发送
Hello from client N消息并等待响应。
- 通过
-
main函数:- 指定 WebSocket 服务器(默认使用
echo.websocket.org进行回显测试)。 - 启动 5 个并发 WebSocket 连接。
- 指定 WebSocket 服务器(默认使用
4. 编译
g++ server.cpp -o server
g++ client.cpp -o client
5. 运行


相关文章:
boost::beast websocket 实例
环境:ubuntu 1. 安装boost sudo apt install -y libboost-all-dev 2. Server端 #include <boost/asio.hpp> #include <boost/beast.hpp> #include <iostream> #include <thread>namespace beast boost::beast; // 从 Boost.Beast 中导…...
复试难度,西电卓越工程师学院(杭研院)考研录取情况
01、卓越工程师学院各个方向 02、24卓越工程师学院(杭研院)近三年复试分数线对比 PS:卓越工程师学院分为广研院、杭研院 分别有新一代电子信息技术、通信工程、集成电路工程、计算机技术、光学信息工程、网络信息安全、机械,这些…...
Rabbitmq--延迟消息
13.延迟消息 延迟消息:生产者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才会收到消息 延迟任务:一定时间之后才会执行的任务 1.死信交换机 当一个队列中的某条消息满足下列情况之一时,就会…...
cocos creator使用mesh修改图片为圆形,减少使用mask,j减少drawcall,优化性能
cocos creator版本2.4.11 一个mask占用drawcall 3个以上,针对游戏中技能图标,cd,以及多玩家头像,是有很大优化空间 1.上代码,只适合单独图片的,不适合在图集中的图片 const { ccclass, property } cc._decorator;c…...
C++ Qt开发成长之路,从入门到企业级实战项目,保姆级学习路线
Qt 介绍 Qt是一个跨平台的C图形用户界面应用程序开发框架,最初由挪威的Trolltech公司开发,后来被诺基亚收购,现在由Qt公司维护。它提供了丰富的工具和类库,使开发者能够轻松地创建各种类型的应用程序,包括桌面应用、移…...
JavaWeb后端基础(7)AOP
AOP是Spring框架的核心之一,那什么是AOP?AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。AOP是一种思想,而在Spring框…...
Uniapp实现地图获取定位功能
摘要:本文将手把手教你如何在Uniapp项目中集成地图功能、实现定位获取,并解决微信小程序、APP、H5三端的兼容性问题🚀🚀🚀 一、环境准备 地图平台选择 微信小程序:腾讯地图(强制使用)…...
批量将 Excel 转换 PDF/Word/CSV以及图片等其它格式
Excel 格式转换是我们工作过程当中非常常见的一个需求,我们通常需要将 Excel 转换为其他各种各样的格式。比如将 Excel 转换为 PDF、比如说将 Excel 转换为 Word、再比如说将 Excel文档转换为图片等等。 这些操作对我们来讲都不难,因为我们通过 Office 都…...
Flutter:StatelessWidget vs StatefulWidget 深度解析
目录 1. 引言 2. StatelessWidget(无状态组件) 2.1 定义与特点 2.2 代码示例 3. StatefulWidget(有状态组件) 3.1 定义与特点 3.2 代码示例 4. StatelessWidget vs StatefulWidget 对比 5. StatefulWidget 生命周期 5.1…...
Stream流学习
Stream流 把数据放进stream流水线,对数据进行一系列操作(中间方法),最后封装(终结方法)。 Stream.of()允许传入任何参数 常见中间方法 可以对数据进行链式(流水线)操作,但…...
多视图几何--恢复相机位姿/内参的几种方法
恢复相机位姿的几种方法 1分解投影矩阵 1.1投影矩阵分解为相机内外参矩阵的完整解析 投影矩阵(Projection Matrix)是计算机视觉中将三维世界点映射到二维像素坐标的核心工具,其本质是相机内参矩阵(Intrinsic Matrix)…...
[数据结构]堆详解
目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 (一)堆排序(重点) (二)TOP-K问题 一、堆的概念及结构 堆的…...
领域驱动设计(DDD)与MVC架构:理念对比与架构选择
领域驱动设计(DDD)与MVC架构:理念对比与架构选择 一、架构之争的本质:业务复杂度驱动技术演进 在软件开发领域,没有银弹式的完美架构,只有适合当前业务场景的合理选择。MVC与DDD的区别本质上是业务复杂度与…...
牛客周赛:84:B:JAVA
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(S…...
【理想解法学习笔记】
目录 理想解法原理简介算法步骤属性值规范化方法代码示例 理想解法 原理简介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一种逼近理想解的排序方法。其基本的处理思路是:首先建立初始化决策矩阵,而后基于规范化后的初…...
CI/CD—Jenkins配置一次完整的jar自动化发布流程
背景: 实现设想: 要创建自动化发布,需要准备一台测试服务器提前安装好java运行所需的环境,JDK版本最好和Windows开发机器上的版本一致,在Jenkins上配置将构建好的jar上传到测试服务器上,测试服务器自动启动…...
Magento2根据图片文件包导入产品图片
图片包给的图片文件是子产品的图片,如下图:A104255是主产品的sku <?php/*** 根据图片包导入产品图片,包含子产品和主产品* 子产品是作为主图,主产品是作为附加图片*/use Magento\Framework\App\Bootstrap;include(../app/boot…...
从零开始的python学习(五)P71+P72+P73+P74
本文章记录观看B站python教程学习笔记和实践感悟,视频链接:【花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…...
OpenHarmony5.0分布式系统源码实现分析—软总线
一、引言 OpenHarmony 作为一款面向万物互联的操作系统,其分布式软总线(Distributed SoftBus)是实现设备间高效通信和协同的核心技术之一。分布式软总线通过构建一个虚拟的总线网络,使得不同设备能够无缝连接、通信和协同工作。本…...
基于SpringBoot实现旅游酒店平台功能六
一、前言介绍: 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高,旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求,旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上࿰…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
基于Java项目的Karate API测试
Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...
GitHub 常见高频问题与解决方案(实用手册)
1.Push 提示权限错误(Permission denied) 问题: Bash Permission denied (publickey) fatal: Could not read from remote repository. 原因: 没有配置 SSH key 或使用了 HTTPS 而没有权限…...
【自然语言处理】大模型时代的数据标注(主动学习)
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构D 实验设计E 个人总结 A 论文出处 论文题目:FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models发表情况:2023-EMNLP作者单位:浙江大…...
项目研究:使用 LangGraph 构建智能客服代理
概述 本教程展示了如何使用 LangGraph 构建一个智能客服代理。LangGraph 是一个强大的工具,可用于构建复杂的语言模型工作流。该代理可以自动分类用户问题、分析情绪,并根据需要生成回应或升级处理。 背景动机 在当今节奏飞快的商业环境中,…...
Unity VR/MR开发-开发环境准备
视频讲解链接: 【XR马斯维】UnityVR/MR开发环境准备【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
[学习笔记]使用git rebase做分支差异化同步
在一个.NET 项目中,使用了Volo.Abp库,但出于某种原因,需要源码调试,因此,使用源码方式集成的项目做了一个分支archive-abp-source 其中引用方式变更操作的提交为:7de53907 后续,在master分支中…...
