0

0

C++怎么使用Boost.Beast实现HTTP/WebSocket服务器_C++网络编程与Boost.Beast应用

穿越時空

穿越時空

发布时间:2025-11-10 09:21:10

|

1023人浏览过

|

来源于php中文网

原创

使用Boost.Beast可实现支持HTTP和WebSocket的C++服务器:1. 配置Boost环境并链接依赖库;2. 通过beast::http实现HTTP请求响应;3. 利用beast::websocket处理升级请求并建立长连接;4. 使用asio异步监听客户端连接,统一分发处理。

c++怎么使用boost.beast实现http/websocket服务器_c++网络编程与boost.beast应用

用C++实现HTTP和WebSocket服务器,Boost.Beast是一个现代、高效且基于标准库风格的网络编程库。它构建在Boost.Asio之上,提供了清晰的接口来处理HTTP协议和WebSocket通信。下面介绍如何使用Boost.Beast搭建一个支持HTTP和WebSocket的简单服务器。

1. 环境准备与依赖配置

确保已安装Boost库(建议1.66及以上版本),并正确配置编译环境。Beast是头文件库,无需单独编译,但依赖Boost.Asio和系统网络库。

安装Boost(Ubuntu示例):
sudo apt-get install libboost-all-dev
编译时链接必要的系统库:
g++ -std=c++17 server.cpp -lboost_system -lpthread

2. 实现HTTP服务器

Beast提供对HTTP消息的完整支持。以下是一个响应静态字符串的HTTP服务器片段:

#include 
#include 
#include 
#include 
#include 
#include 

namespace beast = boost::beast;
namespace http = beast::http;
namespace net = boost::asio;
using tcp = net::ip::tcp;

// 发送HTTP响应
void send_response(http::response& response, 
                   tcp::socket& socket) {
    auto msg = std::make_shared>(std::move(response));
    http::async_write(socket, *msg,
        [&socket, msg](beast::error_code ec, std::size_t) {
            socket.shutdown(tcp::socket::shutdown_send, ec);
            socket.close();
        });
}

// 处理HTTP请求
void handle_request(tcp::socket socket, http::request req) {
    http::response res{http::status::ok, req.version()};
    res.set(http::field::server, "Boost.Beast");
    res.body() = "Hello from HTTP server!";
    res.prepare_payload();
    send_response(std::move(res), std::move(socket));
}

// 接收请求
void do_session(tcp::socket socket) {
    beast::flat_buffer buffer;
    http::request req;
    
    http::async_read(socket, buffer, req,
        [&socket, buffer = std::move(buffer)]
        (beast::error_code ec, std::size_t) mutable {
            if(!ec) handle_request(std::move(socket), std::move(req));
        });
}

3. 添加WebSocket支持

WebSocket连接通常从HTTP升级请求开始。Beast可检测并升级到WebSocket会话。

立即学习C++免费学习笔记(深入)”;

Moshi Chat
Moshi Chat

法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。

下载
#include 

namespace websocket = beast::websocket;

class websocket_session : public std::enable_shared_from_this {
    websocket::stream ws_;

public:
    explicit websocket_session(tcp::socket socket)
        : ws_(std::move(socket)) {}

    void run() {
        ws_.async_accept(
            [self = shared_from_this()](beast::error_code ec) {
                if(ec) return;
                self->do_read();
            });
    }

    void do_read() {
        ws_.async_read(
            buffer_,
            [self = shared_from_this()](beast::error_code ec, std::size_t) {
                if(ec) return;
                self->do_write();
            });
    }

    void do_write() {
        ws_.text(ws_.got_text());
        ws_.async_write(
            buffer_.data(),
            [self = shared_from_this()](beast::error_code ec, std::size_t) {
                if(ec) return;
                self->do_read();
            });
    }

private:
    beast::flat_buffer buffer_;
};

// 检查是否为WebSocket升级请求
bool is_websocket_upgrade(const http::request& req) {
    return req.method() == http::verb::get
        && req.target() == "/ws"
        && req[http::field::upgrade] == "websocket";
}

在主处理逻辑中判断请求类型:

if(is_websocket_upgrade(req)) {
    std::make_shared(std::move(socket))->run();
} else {
    handle_request(std::move(socket), std::move(req));
}

4. 启动监听服务

使用Asio的io_context启动TCP监听:

int main() {
    net::io_context ioc;
    tcp::acceptor acceptor(ioc, {tcp::v4(), 8080});

    while(true) {
        tcp::socket socket(ioc);
        acceptor.accept(socket);
        do_session(std::move(socket));
    }
}

更高效的写法是使用异步accept结合`net::dispatch`管理生命周期,避免阻塞循环。

基本上就这些。Boost.Beast通过组合HTTP和WebSocket组件,让C++编写现代网络服务变得简洁可控。关键是理解其基于回调的异步模型,并合理管理对象生命周期。不复杂但容易忽略。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

609

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

547

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

539

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

158

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

77

2025.08.07

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号