websocketpp库使用:快速搭建一个websocket服务端

news/2025/2/21 12:22:06/

目录

websocket%E5%8D%8F%E8%AE%AE-toc" name="tableOfContents" style="margin-left:0px">1.websocket协议

websocket%E5%8D%8F%E8%AE%AE%E8%AF%9E%E7%94%9F%E7%9A%84%E5%8E%9F%E5%9B%A0-toc" name="tableOfContents" style="margin-left:40px">1.1websocket协议诞生的原因

websocket%20VS%20http-toc" name="tableOfContents" style="margin-left:40px">1.2websocket VS http

websocket%E5%8D%8F%E8%AE%AE%E6%8A%A5%E5%A4%B4-toc" name="tableOfContents" style="margin-left:40px">1.3websocket协议报头

websocketpp%E6%90%AD%E5%BB%BA%E7%AE%80%E5%8D%95%E6%9C%8D%E5%8A%A1%E5%99%A8-toc" name="tableOfContents" style="margin-left:0px">2.websocketpp搭建简单服务器


websocket%E5%8D%8F%E8%AE%AE" name="1.websocket%E5%8D%8F%E8%AE%AE">1.websocket协议

websocket%E5%8D%8F%E8%AE%AE%E8%AF%9E%E7%94%9F%E7%9A%84%E5%8E%9F%E5%9B%A0" name="1.1websocket%E5%8D%8F%E8%AE%AE%E8%AF%9E%E7%94%9F%E7%9A%84%E5%8E%9F%E5%9B%A0">1.1websocket协议诞生的原因

传统的 HTTP 协议采用的是请求 - 响应的单向通信模式,即客户端必须主动发起请求,服务器才能做出响应。在需要实时更新数据的场景下,如在线聊天、实时股票行情显示等,客户端为了获取最新信息,不得不频繁地向服务器发送请求,这种方式会造成大量不必要的网络流量和服务器负载,同时也无法保证数据的实时性。

websocket%20VS%20http" name="1.2websocket%20VS%20http">1.2websocket VS http

websocket%E5%8D%8F%E8%AE%AE%E6%8A%A5%E5%A4%B4" name="1.3websocket%E5%8D%8F%E8%AE%AE%E6%8A%A5%E5%A4%B4">1.3websocket协议报头

websocket协议通常是由http协议切换而来的。

客户端会向服务器发送一个,含有websocket信息的请求。

GET /chat HTTP/1.1
Host: example.com:8080
Upgrade: websocket //表明客户端希望将当前的 HTTP 连接升级为 WebSocket 连接
Connection: Upgrade //告知服务器将http协议切换为websocket
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 
Sec-WebSocket-Version: 13
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

Upgrade: websocket 表明客户端希望将当前的 HTTP 连接升级为 WebSocket 连接

Connection: Upgrade 告知服务器需要进行协议升级。

Sec-WebSocket-Key:一个 Base64 编码的随机值,用于防止普通的 HTTP 连接被误当作 WebSocket 连接。服务器会使用这个值进行计算并在响应中返回一个加密的键,以此验证连接的合法性。

Sec-WebSocket-Version:指定客户端支持的 WebSocket 协议版本,目前常用的版本是 13。

服务器收到客户端的升级请求后,如果同意升级,会返回一个状态码为 101 的响应,并包含相应的报头信息。

FIN:表示这是否是消息的最后一帧。

如果为 1,则表示该消息已完整传输;如果为 0,则表示后续还有其他帧。

Opcode:用于指示帧的类型。

常见的操作码包括 0x0(延续帧)、0x1(文本帧)、0x2(二进制帧)、0x8(关闭帧)、0x9(Ping 帧)和 0xA(Pong 帧)。

Mask:表示是否对数据进行掩码处理。

客户端发送的帧必须进行掩码处理,服务器发送的帧不能进行掩码处理。

Payload length:表示负载数据的长度。

如果值在 0 - 125 之间,则直接使用 7 位表示;如果为 126,则接下来的 16 位表示负载长度;如果为 127,则接下来的 64 位表示负载长度

Mask-Key:当mask为1时存在,长度为4字节,

解码规则:DECODED[i]=ENCODED[i]^MASK[i %4]

Payloaddata:报文携带的载荷数据

websocketpp%E6%90%AD%E5%BB%BA%E7%AE%80%E5%8D%95%E6%9C%8D%E5%8A%A1%E5%99%A8" name="2.websocketpp%E6%90%AD%E5%BB%BA%E7%AE%80%E5%8D%95%E6%9C%8D%E5%8A%A1%E5%99%A8">2.websocketpp搭建简单服务器

#include <iostream>
#include <websocketpp/server.hpp>
#include <websocketpp/config/asio_no_tls.hpp>
#include <string>//websocketpp::server<websocketpp::config::asio> 指定asio网络库作为websocket的服务器
typedef websocketpp::server<websocketpp::config::asio> ws;
typedef websocketpp::server<websocketpp::config::asio>::message_ptr message_ptr;
typedef websocketpp::server<websocketpp::config::asio>::connection_ptr connection_ptr;//websocketpp::connection_hdl conn 是一个表示连接的句柄,本身没有什么意义
void httpCallBack(ws *server, websocketpp::connection_hdl conn) 
{std::cout <<"get a http request " << std::endl;connection_ptr connPtr = server->get_con_from_hdl(conn);// 通过句柄获取一个真正的连接std::string response = R"(<html><p>hello word<p></html>)";connPtr->set_body(response);connPtr->set_status(websocketpp::http::status_code::ok);
}void openCallBack(ws *server, websocketpp::connection_hdl conn)
{std::cout <<"get a new connection " << std::endl;
}void closeCallBack(ws *server, websocketpp::connection_hdl conn)
{std::cout <<"a connection closed" << std::endl;
}void messageCallBack(ws *server, websocketpp::connection_hdl conn, message_ptr message)
{std::cout << "a message come" << std::endl;server->send(conn, message->get_payload(),websocketpp::frame::opcode::text);
}int main()
{//1.创建websocket服务实例ws server;//2.设置日志等级server.set_access_channels(websocketpp::log::alevel::none);//3.初始化asioserver.init_asio();//4.设置地址重用server.set_reuse_addr(true);//5.设置回调函数//设置http请求的回调函数server.set_http_handler(std::bind(&httpCallBack, &server, std::placeholders::_1));//设置websocket请求的回调函数server.set_open_handler(std::bind(&openCallBack, &server, std::placeholders::_1)); //建立连接成功的回调server.set_close_handler(std::bind(&closeCallBack, &server, std::placeholders::_1));//连接关闭的回调server.set_message_handler(std::bind(&messageCallBack, &server, std::placeholders::_1, std::placeholders::_2));//消息到来的回调//6.设置端口server.listen(8080);//7.接受连接server.start_accept();//8.运行服务server.run();return 0;
}
websocket:websocket.ccg++ -o $@ $^ -std=c++11 -lpthread -lboost_system.PHONY:clean
clean:rm -rf websocket


http://www.ppmy.cn/news/1572498.html

相关文章

YOLOv5-Seg 完全指南:从训练到后处理

YOLOv5-Seg 是 Ultralytics 官方基于 YOLOv5 目标检测模型的分割分支&#xff0c;能够在 目标检测 的基础上进行 实例分割。相比传统的分割模型&#xff08;如 Mask R-CNN&#xff09;&#xff0c;YOLOv5-Seg 具备 速度快、结构轻量、容易部署 等优势。 本教程将详细介绍 YOLO…

年会大屏幕抽奖系统制作

‌小程序通过大屏幕展示抽奖过程的方式&#xff0c;无疑为抽奖活动带来了一场深刻的变革。这一创新举措不仅极大地提升了抽奖活动的透明度和公正性&#xff0c;使得整个抽奖流程变得公开、清晰&#xff0c;让每一位参与者都能亲眼见证抽奖的每一个环节&#xff0c;从而有效消除…

Java 基于 SpringBoot+Vue 的家政服务管理平台设计与实现

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示

1、现象&#xff1a;当Qt的窗口最小化时&#xff0c;isVisible值一定是true&#xff0c;这是正常的。 解释&#xff1a;在Qt中&#xff0c;当你点击窗口的最小化按钮时&#xff0c;Qt内部不会自动调用 hide() 方或 setVisible(false) 来隐藏窗口。相反&#xff0c;它会改变窗口…

Spring Cloud + Nacos + K8S 零影响发布方案

问题描述 在生产环境中使用 springcloud 框架&#xff0c;由于服务更新过程中&#xff0c;容器服务会被直接停止&#xff0c;部分请求仍被分发到终止的容器&#xff0c;导致服务出现500错误&#xff0c;这部分错误请求数据占用比较少&#xff0c;因为Pod滚动更新都是一对一。因…

C语言——搜索:查找某个数的位置(遍历,二分查找……)

在 C 语言编程里&#xff0c;搜索某个数在数组或者数据集合中的位置是一项基础且重要的操作。 目录 一、遍历查找&#xff08;顺序查找&#xff09; 二、二分查找 三、插值查找 四、斐波那契查找 五、哈希查找 一、遍历查找&#xff08;顺序查找&#xff09; &#xff0…

vue开发06:前端通过webpack配置代理处理跨域问题

1.定义 在浏览器尝试请求不同源&#xff08;域名、协议、端口号不同&#xff09;的资源时&#xff0c;浏览器的同源策略会阻止这种跨域请求。&#xff08;比如前端端口15500&#xff0c;后端端口5050&#xff0c;前端界面不可以直接调用5050端口&#xff09; 2.解决方案 使用前…

一天急速通关SpringMVC

一天急速通关SpringMVC 0 文章介绍1 介绍1.1 MVC架构与三层架构1.2 Spring MVC介绍1.3 入门程序 2 请求的映射3 请求数据的接收3.1 RequestParam接收3.2 POJO/JavaBean接收3.3 RequestHeader和CookieValue接收 4 请求数据的传递5 视图5.1 视图的理解5.2 请求转发和响应重定向的…