websocketpp 安装及使用
介绍
- 传统的 web 程序都是属于 "一问一答" 的形式,即客户端给服务器发送了一个 HTTP 请求,服务器给客户端返回一个 HTTP 响应。这种情况下服务器是属于被动的一方,如果客户端不主动发起请求服务器就无法主动给客户端响应。
- 像网页即时聊天这样的程序都是非常依赖 "消息推送" 的,即需要服务器主动推动消息到客户端。如果只是使用原生的 HTTP 协议,要想实现消息推送一般需要通过 "轮询" 的方式实现, 而轮询的成本比较高并且也不能及时的获取到消息的响应。
与 HTTP 对比
特性 | WebSocket | HTTP |
---|---|---|
连接方式 | 持久化长连接 | 短连接(请求-响应) |
通信模式 | 全双工 | 半双工(客户端发起) |
头部开销 | 小(帧格式) | 大(每次携带完整头) |
适用场景 | 实时交互 | 静态资源获取 |
核心特性
-
全双工通信:客户端和服务器可以同时双向发送数据,无需等待请求-响应周期。
-
低延迟:建立连接后,数据可以即时传输,无需重复建立连接(HTTP 每次请求需握手)。
-
轻量级协议:数据帧头部开销小(最小仅 2 字节),适合高频通信。
-
基于 TCP:工作在 OSI 模型的传输层之上,依赖 TCP 的可靠性。
原理解析

- HTTP 升级请求(客户端发起)
客户端发送一个包含 Upgrade: websocket 头的 HTTP 请求,其中 Sec-WebSocket-Key 是随机生成的 Base64 字符串,用于安全校验:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
- 服务器响应切换协议
服务器返回 HTTP 101 Switching Protocols 表示协议升级成功,其中 Sec-WebSocket-Accept 是客户端 Key 与固定 GUID 拼接后通过 SHA-1 哈希生成的,用于验证握手合法性:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
- 连接建立
此后,通信转为 WebSocket 协议,数据以帧(Frame)形式传输。
数据帧格式
WebSocket 数据帧包含以下关键字段(二进制格式):
- FIN: WebSocket 传输数据以消息为概念单位,一个消息有可能由一个或多个帧组成,FIN 字段为 1 表示末尾帧。
- RSV1~3:保留字段,只在扩展时使用,若未启用扩展则应置 1,若收到不全为 0 的数据帧,且未协商扩展则立即终止连接。
- opcode: 标志当前数据帧的类型
- 0x0: 表示这是个延续帧,当 opcode 为 0 表示本次数据传输采用了数据分片,当前收到的帧为其中一个分片
- 0x1: 表示这是文本帧
- 0x2: 表示这是二进制帧
- 0x3-0x7: 保留,暂未使用
- 0x8: 表示连接断开
- 0x9: 表示 ping 帧
- 0xa: 表示 pong 帧
- 0xb-0xf: 保留,暂未使用
- mask:表示 Payload 数据是否被编码,若为 1 则必有 Mask-Key,用于解码 Payload 数据。仅客户端发送给服务端的消息需要设置。
- Payload length:数据载荷的长度,单位是字节, 有可能为 7 位、7+16 位、7+64
- 位。假设 Payload length = x:
- x 为 0~126:数据的长度为 x 字节
- x 为 126:后续 2 个字节代表一个 16 位的无符号整数,该无符号整数的值为数据的长度
- x 为 127:后续 8 个字节代表一个 64 位的无符号整数(最高位为 0),该无符号整数的值为数据的长度
- Mask-Key:当 mask 为 1 时存在,长度为 4 字节,解码规则: DECODED[i] = ENCODED[i] ^ MASK[i % 4]
- Payload data: 报文携带的载荷数据
Websocketpp 介绍
- 事件驱动的接口
- 支持 HTTP/HTTPS、WS/WSS、IPv6
- 灵活的依赖管理 — Boost 库/C++11 标准库
- 可移植性:Posix/Windows、32/64bit、Intel/ARM
- 线程安全
- github:https://github.com/zaphoyd/websocketpp
- 用户手册: http://docs.websocketpp.org/
- 官网:http://www.zaphoyd.com/websocketpp
安装
sudo apt-get install libboost-dev libboost-system-dev libwebsocketpp-dev
安装完毕后,若在 /usr/include 下有了 websocketpp 目录就表示安装成功了。
websocketpp 常用接口
namespace websocketpp
{typedef lib::weak_ptr<void> connection_hdl;template <typename config>class endpoint : public config::socket_type{typedef lib::shared_ptr<lib::asio::steady_timer> timer_ptr;typedef typename connection_type::ptr connection_ptr;typedef typename connection_type::message_ptr message_ptr;typedef lib::function<void(connection_hdl)> open_handler;typedef lib::function<void(connection_hdl)> close_handler;typedef lib::function<void(connection_hdl)> http_handler;typedef lib::function<void(connection_hdl, message_ptr)>message_handler;/* websocketpp::log::alevel::none 禁止打印所有日志*/void set_access_channels(log::level channels); /*设置日志打印等级*/void clear_access_channels(log::level channels); /*清除指定等级的日志*//*设置指定事件的回调函数*/void set_open_handler(open_handler h); /*websocket 握手成功回调处理函数*/void set_close_handler(close_handler h); /*websocket 连接关闭回调处理函数*/void set_message_handler(message_handler h); /*websocket 消息回调处理函数*/void set_http_handler(http_handler h); /*http 请求回调处理函数*//*发送数据接口*/void send(connection_hdl hdl, std::string &payload, frame::opcode::value op);void send(connection_hdl hdl, void *payload, size_t len, frame::opcode::value op);/*关闭连接接口*/void close(connection_hdl hdl, close::status::value code, std::string &reason);/*获取 connection_hdl 对应连接的 connection_ptr*/connection_ptr get_con_from_hdl(connection_hdl hdl);/*websocketpp 基于 asio 框架实现,init_asio 用于初始化 asio 框架中的 io_service 调度器*/void init_asio();/*设置是否启用地址重用*/void set_reuse_addr(bool value);/*设置 endpoint 的绑定监听端口*/void listen(uint16_t port);/*对 io_service 对象的 run 接口封装,用于启动服务器*/std::size_t run();/*websocketpp 提供的定时器,以毫秒为单位*/timer_ptr set_timer(long duration, timer_handler callback);};template <typename config>class server : public endpoint<connection<config>, config>{/*初始化并启动服务端监听连接的 accept 事件处理*/void start_accept();};template <typename config>class connection: public config::transport_type::transport_con_type,public config::connection_base{/*发送数据接口*/error_code send(std::string &payload, frame::opcode::value op = frame::opcode::text);/*获取 http 请求头部*/std::string const &get_request_header(std::string const &key);/*获取请求正文*/std::string const &get_request_body();/*设置响应状态码*/void set_status(http::status_code::value code);/*设置 http 响应正文*/void set_body(std::string const &value);/*添加 http 响应头部字段*/void append_header(std::string const &key, std::string const &val);/*获取 http 请求对象*/request_type const &get_request();/*获取 connection_ptr 对应的 connection_hdl */connection_hdl get_handle();};namespace http{namespace parser{class parser{std::string const &get_header(std::string const &key);std::string const &get_body();typedef std::map<std::string, std::string,utility::ci_less> header_list;header_list const &get_headers();};class request : public parser{/*获取请求方法*/std::string const &get_method()/*获取请求 uri 接口*/std::string const &get_uri()};}};namespace message_buffer{/*获取 websocket 请求中的 payload 数据类型*/frame::opcode::value get_opcode();/*获取 websocket 中 payload 数据*/std::string const &get_payload();};
}
Websocketpp 使用
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>// 1. 定义server类型
typedef websocketpp::server<websocketpp::config::asio> server_t;void onOpen(websocketpp::connection_hdl hdl)
{std::cout << "websocket长连接建立成功!\n";
}
void onClose(websocketpp::connection_hdl hdl)
{std::cout << "websocket长连接关闭!\n";
}
void onMessage(server_t *server, websocketpp::connection_hdl hdl, server_t::message_ptr msg)
{// 1. 获取有效载荷std::string body = msg->get_payload();std::cout << "收到消息:" << body << std::endl;// 2. 对客户端进行响应auto conn = server->get_con_from_hdl(hdl);conn->send(body + "-Hello!", websocketpp::frame::opcode::value::text);
}
int main()
{// 2. 实例化服务器对象server_t server;// 3. 初始化日志输出,关闭日志输出server.set_access_channels(websocketpp::log::alevel::none);// 4. 初始化asio框架server.init_asio();// 5. 设置消息处理/连接握手成功/关闭连接回调函数server.set_open_handler(onOpen);server.set_close_handler(onClose);auto msg_handler=std::bind(onMessage,&server,std::placeholders::_1,std::placeholders::_2);server.set_message_handler(msg_handler);// 6. 启用地址重用server.set_reuse_addr(true);// 7. 设置监听端口server.listen(9090);// 8. 开始监听server.start_accept();// 9. 启动服务器server.run();return 0;
}
makefile
main:main.ccg++ -o $@ $^ -std=c++17 -lpthread -lboost_system
test.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Test Websocket</title>
</head><body><input type="text" id="message"><button id="submit">提交</button><script>// 创建 websocket 实例// ws://192.168.22.129:9090// 类比 http// ws 表示 websocket 协议let websocket = new WebSocket("ws://192.168.22.129:9090");// 处理连接打开的回调函数websocket.onopen = function () {console.log("连接建立");}// 处理收到消息的回调函数// 控制台打印消息websocket.onmessage = function (e) {console.log("收到消息: " + e.data);}// 处理连接异常的回调函数websocket.onerror = function () {console.log("连接异常");}// 处理连接关闭的回调函数websocket.onclose = function () {console.log("连接关闭");}// 实现点击按钮后, 通过 websocket 实例 向服务器发送请求let input = document.querySelector('#message');let button = document.querySelector('#submit');button.onclick = function () {console.log("发送消息: " + input.value);websocket.send(input.value);} </script>
</body></html>
相关文章:
websocketpp 安装及使用
介绍 WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的消息推送机制。 传统的 web 程序都是属于 "一问一答" 的形式,即客户端给服务器发送了一个 HTTP 请求,服务器给客户端返回一个 HTTP 响应。这种情况下服务器是属于被动…...
【大数据】MapReduce 编程--WordCount
API 是“Application Programming Interface”的缩写,即“应用程序编程接口” Hadoop 提供了一套 基于 Java 的 API,用于开发 MapReduce 程序、访问 HDFS、控制作业等 MapReduce 是一种 分布式并行计算模型,主要用于处理 大规模数据集。它将…...
北京市通州区经信局对新增通过国家级生成式人工智能及深度合成算法备案企业给予100w、20w一次性补贴
北京市通州区经济和信息化局 关于发布支持北京城市副中心数字经济高质量发展的实施指南(第一批)的通知 各有关单位: 为培育千亿级数字经济产业集群,促进数字经济和实体经济深度融合,助推北京城市副中心产业高质量发展&…...
机器学习驱动的智能化电池管理技术与应用
在人工智能与电池管理技术融合的背景下,电池科技的研究和应用正迅速发展,创新解决方案层出不穷。从电池性能的精确评估到复杂电池系统的智能监控,从数据驱动的故障诊断到电池寿命的预测优化,人工智能技术正以其强大的数据处理能力…...
GTC2025——英伟达布局推理领域加速
英伟达GTC2025大会于今年3月18日举行,会上NVIDIA CEO黄仁勋展示了其过去所取得的成就,以及未来的布局目标——通过纵向扩展(scale out)和横向扩展(scale up)解决终极的计算问题——推理。本文将回顾NVIDIA在…...
5.12 note
Leetcode 图 邻接矩阵的dfs遍历 class Solution { private: vector<vector<int>> paths; vector<int> path; void dfs(vector<vector<int>>& graph, int node) { // 到n - 1结点了保存 if (node graph.size() - 1)…...
Java Spring Boot项目目录规范示例
以下是一个典型的 Java Spring Boot 项目目录结构规范示例,结合了分层架构和模块化设计的最佳实践: text 复制 下载 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── myapp/ │…...
记录裁员后的半年前端求职经历
普通的人生终起波澜 去年下半年应该算是我毕业以来发生人生变故最多的一段时间。 先是 7 月份的时候发作了一次急性痛风,一个人在厦门,坐在床上路都走不了,那时候真的好想旁边能有个人能扶我去医院,真的是感受到 10 级的孤独。尝…...
学习黑客BitLocker与TPM详解
BitLocker与TPM详解:数据加密的坚固堡垒 🔐🛡️ 学习目标:掌握BitLocker加密原理、TPM工作机制及其配置方法,提升数据安全防护水平 1. 数据保护的最后防线:BitLocker与TPM简介 💼 在当今世界&a…...
综合实验二之grub2密文加密
实验二、grub2密文加密 Grub2 密文加密的作用: 保护系统安全: 防止未经授权的用户在系统启动时进入 Grub2 菜单,通过修改启动参数来绕过系统的安全机制,进而访问或篡改系统文件和数据。例如,恶意用户可能试图通过修改启…...
【Java学习】Lambda表达式
目录 一、函数式匿名 1.环境确定 2.Lambda部分实现 二、函数式书写 Lambda表达式: 三、函数式接口 1.Consumer行为接口 1.1Lambda匿名实现(核心) 1.2创建使用全过程 1.2.1创建匿名子类实例 1.2.1.1环境确定 1.2.1.2匿名实现 1.2.2向上转型 1.2.3Lamb…...
精益数据分析(55/126):双边市场模式的挑战、策略与创业阶段关联
精益数据分析(55/126):双边市场模式的挑战、策略与创业阶段关联 在创业和数据分析的学习旅程中,我们持续探索不同商业模式的奥秘。今天,依旧怀揣着与大家共同进步的想法,深入研读《精益数据分析》…...
人工智能100问☞第21问:神经网络如何模拟人脑结构?
目录 一、通俗解释 二、专业解析 三、权威参考 神经网络通过分层连接的人工神经元模拟人脑结构,其中输入层接收信号(模拟树突接收信息),隐藏层通过权重调整(模拟突触可塑性)进行特征提取,输出层生成结果(类似轴突传递信号),并利用反向传播机制(类比生物神…...
Vue 3 实现转盘抽奖效果
🎡 使用 Vue 3 实现转盘抽奖效果 在移动端或营销活动中,转盘抽奖是一种非常常见的互动方式。本文基于 Vue 3 TypeScript 实现一个视觉炫酷、逻辑完整的转盘抽奖功能,并支持「指定奖品必中」的逻辑。 iShot_2025-05-12_11.31.27 ᾟ…...
Python 处理图像并生成 JSONL 元数据文件 - 灵活text版本
Python 处理图像并生成 JSONL 元数据文件 - 灵活text版本 flyfish import os import json import argparse from PIL import Image from xpinyin import Pinyinclass ImageConverter:def __init__(self, src_folder, dest_folder, target_size1024, output_format"JPEG&…...
LeRobot 项目部署运行逻辑(七)—— ACT 在 Mobile ALOHA 训练与部署
全部流程为:硬件配置 -> 环境安装 -> 遥操作数据采集 -> 数据集可视化 -> 策略训练 -> 策略评估 在之前的笔记中已经完成了绝大部分,最后再记录一下最后的训练部署,算是最简单的部分了 目录 1 ACT 训练 2 ALOHA 部署 3 更…...
【NextPilot日志移植】ULog
📚 ULog 日志系统详解 关键词:结构化日志、飞行数据记录、自描述格式、嵌入式系统、PX4、NextPilot 🧠 一、ULog 是什么? ULog(Universal Log) 是 PX4/NextPilot 飞控系统中使用的结构化日志格式ÿ…...
扩展:React 项目执行 yarn eject 后的 scripts 目录结构详解
扩展:React 项目执行 yarn eject 后的 scripts 目录结构详解 什么是 yarn eject?scripts 目录结构与说明各脚本说明说明 什么是 yarn eject? yarn eject 是 Create React App(简称 CRA)提供的一条命令,用于…...
Android11.0 framework第三方无源码APP读写断电后数据丢失问题解决
1.前言 在11.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…...
多样本整合Banksy空间聚类分析(Visium HD, Xenium, CosMx)
在空间数据分析中,传统的单细胞聚类算法,例如Seurat和Scanpy中的lovain和leiden等聚类算法,通常在处理空间数据时忽略了空间信息。然而,由于细胞状态受其周围细胞的影响,将转录组数据与细胞的空间信息结合起来进行聚类…...
【2025最新】Vm虚拟机中直接使用Ubuntu 免安装过程直接使用教程与下载
Ubuntu 是一个基于 Debian 的自由开源 Linux 操作系统,面向桌面、服务器和云计算平台广泛应用。 由英国公司 Canonical Ltd. 维护和发布,Ubuntu 强调易用性、安全性和稳定性,适合个人用户、开发者以及企业部署使用。 Ubuntu 默认使用 GNOME …...
【Leetcode】系列之206反转链表
反转链表 题目描述解决思路过程示例代码示例结果展示 总结 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 解决思路 next_node:临时存放当前指针指向下一个指针的变量;pre:存放空指针;curr࿱…...
图灵爬虫练习平台第十九题js逆向
题十九:法外狂徒 该题适合JS逆向学习的小伙伴练习,模拟国内某大型网站 数据加密设计,给大家练练手 还是先f12看看是什么加密,发现是 返回数据最后加密了 还是先堆栈分析一下,直接点进去 打上断点分析一下,…...
Ubuntu 22初始配置(root、ssh)
1.设置root密码 并启用root用户 sudo passwd root sudo passwd -u root 2.安装ssh apt install openssh-server systemctl enable --now ssh 3.支持root通过ssh登录 vim /etc/ssh/sshd_config 是sshd_config(服务端) 不是ssh_config(客户端) 最后增加一…...
css3响应式布局
css3响应式布局 响应式设计是现代网页开发的重要组成部分,它确保网页在不同的屏幕尺寸上都有良好的显示效果。 在CSS中,实现响应式布局是一种常用的技术,旨在使网页能够根据用户的设备和屏幕尺寸自动调整其布局和样式。这种技术对于确保网站…...
【DeepSeek问答记录】请结合实例,讲解一下pytorch的DataLoader的使用方法
PyTorch的DataLoader是数据加载的核心工具,可高效处理批量数据、并行加载和自动打乱。以下是一个结合实例的分步讲解: 1. 基础使用流程 import torch from torch.utils.data import Dataset, DataLoader# 自定义数据集类(必须实现__len__和…...
Codeforces Round 1024 (Div. 2)(A-D)
题面链接:Dashboard - Codeforces Round 1024 (Div. 2) - Codeforces A. Dinner Time 思路 一共n个数被分成n/p个区间,每个区间内的和是q,如果还有除构成区间外剩余的数那么就一定能构造,如果没有剩余就看所有区间的和是否等于…...
大语言模型强化学习双强:OpenRLHF与verl技术解析
引言 随着大语言模型(LLM)参数规模突破千亿级,如何高效完成基于人类反馈的强化学习(RLHF)训练成为行业焦点。OpenRLHF与verl作为开源社区两大标杆框架,分别以Ray分布式架构和HybridFlow混合控制器为核心&a…...
ARM Cortex-M3内核详解
目录 一、ARM Cortex-M3内核基本介绍 (一)基本介绍 (二)主要组成部分 (三)调试系统 二、ARM Cortex-M3内核的内核架构 三、ARM Cortex-M3内核的寄存器 四、ARM Cortex-M3内核的存储结构 五、ARM Co…...
关于高并发GIS数据处理的一点经验分享
1、背景介绍 笔者过去几年在参与某个大型央企的项目开发过程中,遇到了十分棘手的难题。其与我们平常接触的项目性质完全不同。在一般的项目中,客户一般只要求我们能够通过桌面软件对原始数据进行加工处理,将各类地理信息数据加工处理成地图/场景和工作空间,然后再将工作空…...
vue3+flask+sqlite前后端项目实战
基础环境安装 pycharm 下载地址: https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows vscode 下载地址 https://code.visualstudio.com/docs/?dvwin64user python 下载地址 https://www.python.org/downloads/windows/ Node.js(含npm…...
支付宝API-SKD-GO版
前言 支付宝api的sdk没有提供go版,这里自己封装了一个go版的sdk,有需要的朋友可以自取使用 支付宝 AliPay SDK for Go, 集成简单,功能完善,持续更新,支持公钥证书和普通公钥进行签名和验签。 安装 go get github.c…...
uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
由于"微信小程序"存在【样式隔离机制】,且默认设置为isolated(启用样式隔离),因此这里给出以下两种解决方案: 注意: 这2种方案父子组件<style>标签不能添加"scoped" 1.CSS变量穿透(推荐: 此方案不受样…...
AI时代还需要目视解译吗?——目视解译详解
在遥感技术迅猛发展的今天,尽管计算机自动解译算法层出不穷,目视解译仍然保持着其基础性和权威性的地位。作为遥感信息提取的"黄金标准",目视解译凭借人类认知系统的独特优势,在多个专业领域持续发挥着不可替代的作用。…...
苹果电脑笔记本macos Mac安装mixly 米思齐软件详细指南
一、下载安装包 二、安装 1、解压下载的文件,然后将解压后文件夹中的中文名称部分删掉只保留英文名称,例如:mixly2.0-mac 2、将mixly2.0-mac文件夹移动到当前用户的Documents路径下,注意路径中不要有中文。 3、进入mixly2.0-mac文…...
slackware系统详解
Slackware 是最古老的活跃维护的 Linux 发行版之一,由 Patrick Volkerding 于 1993 年创建。它以简洁性、稳定性和遵循 Unix 哲学为核心理念,适合追求高度控制和手动配置的用户。以下是 Slackware 的详细介绍: 1. 核心特点 简洁性 (Simplici…...
力扣210(拓扑排序)
210. 课程表 II - 力扣(LeetCode) 这是一道拓扑排序的模板题。简单来说,给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。如果有向图中有环就没有办法进行拓扑排序了。因此,拓扑排序也是图论中判断有向无环图…...
Promise/A+ 规范中文解读
一、简介 Promise/A 是一个开放、健全且通用的JavaScript Promise标准,由开发者制定并供开发者参考。其核心目标是定义then方法的行为,确保不同Promise实现的互操作性。规范聚焦于异步操作的最终结果交互机制,而非Promise的创建、解决或拒绝…...
多媒体预研
主要包含h265 av1 等各种 多媒体的具体应用 svac_plugin ZLMediaKit/ext-codec at master cyf88/ZLMediaKit D:\java\xiachu\otherzlm\ZLMediaKit> sip-client GB28181-Service/SipClient at master Washington-DC/GB28181-Service yolo Jackson-Tan/wvp_pro_yolo: 小…...
动态网站 LNMP
一、名词解释: LNMP: L : 代表 Linux 操作系统,为网站提供了可靠的运行环境N : 代表 Nginx,它是一款轻量级的高性能 Web 服务器,能够快速处理大量并 发连接,有效提升网站的访问速度和性能 M : 代表…...
【Leetcode刷题随笔】349. 两个数组的交集
1. 题目描述 给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。 示例1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2] 题目条件: 1 < nums1.length, nums2.length < 10…...
如何优雅的使用CMake中的FindPkgConfig模块
背景 如果你遇到下面的场景,那么FindPkgConfig模块可以用来解决我们引用上游库的问题。 上游库没有提供CMake的配置文件。CMake没有提供相应的查找模块,即Find<PackageName>.cmake的文件。上游库提供了pkg-config使用的.pc文件。 如果上面三个条…...
Docker Volumes
Docker Volumes 是 Docker 提供的一种机制,用于持久化存储容器数据。与容器的生命周期不同,Volumes 可以独立存在,即使容器被删除,数据仍然保留。以下是关于 Docker Volumes 的详细说明: 1. 为什么需要 Volumes&#…...
[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取当前用户主目录(即:~波浪符号目录)?
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...
day23 机器学习管道 Pipeline
在机器学习中,数据预处理、特征提取、模型训练和评估等步骤通常是按顺序执行的。为了更高效地管理和复用这些步骤,我们可以使用 Pipeline(管道)来构建一个完整的机器学习流水线。本文将详细介绍 Pipeline 的基础概念,并…...
The Graph:区块链数据索引的技术架构与创新实践
作为Web3生态的核心基础设施,The Graph通过去中心化索引协议重塑了链上数据访问的范式。其技术设计不仅解决了传统区块链数据查询的效率瓶颈,还通过经济模型与多链兼容性构建了一个开放的开发者生态。本文从技术角度解析其架构、机制及创新实践。 一、技…...
nginx配置sse流传输问题:直到所有内容返回后才往下传输
一、禁用缓冲(如实时流传输): location /stream {proxy_buffering off; } 二、开启分块传输 location /your-path {proxy_chunked_transfer_encoding on; # 显式启用分块传输(默认已启用) }...
使用Daemonset部署日志收集守护进程
1.DaemonSet简介: 在Kubernetes(简称k8s)中,DaemonSet是一种控制器,用于确保集群中的每个(或部分)节点运行一个指定的Pod副本。DaemonSet非常适合需要全局部署、节点级运行的服务,如…...
在Mac环境下搭建Docker环境的全攻略
在Mac环境下搭建Docker环境的全攻略 在现代软件开发中,Docker已经成为不可或缺的工具之一。它不仅简化了应用的部署和管理,还极大地提升了开发效率。然而,在某些公司环境中,桌面版的Docker可能会被禁用,这给开发工作带…...
Go 语言 slice(切片) 的使用
序言 在许多开发语言中,动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组,因为对于数组的大小大多数情况下我们是不能事先就确定好的,所以他不够灵活。动态数组通过提供自动扩容的机制,极大地提升了开发效率。这…...