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 项目摘要 随着社会的快速发展和人民生活水平的不断提高,旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求,旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上࿰…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
