c++ websocket简单讲解

只做简单讲解。

一.定义和原理

        WebSocket 是从 HTML5 开始⽀持的⼀种⽹⻚端和服务端保持⻓连接的消息推送机制,传统的 web 程序都是属于 "⼀问⼀答" 的形式,即客⼾端给服务器发送了⼀个 HTTP 请求,服务器给客⼾端返回⼀个 HTTP 响应。这种情况下服务器是属于被动的⼀⽅,如果客⼾端不主动发起请求服务器就⽆法主动给客⼾端响应。

        WebSocket 更接近于 TCP 这种级别的通信⽅式,⼀旦连接建⽴完成客⼾端或者服务器都可以主动的向对⽅发送数据。WebSocket 协议本质上是⼀个基于 TCP 的协议。为了建⽴⼀个 WebSocket 连接,客⼾端浏览器⾸先 要向服务器发起⼀个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了⼀些附加头信息,通过 这个附加头信息完成握⼿过程并升级协议的过程。

        首先先经过TCP三次握手,然后再通过HTTP协议发送更新协议请求,最终切换为websocket协议进行通信。 

        WebSocketpp同时⽀持HTTP和Websocket两种⽹络协议。

二.搭建服务器简易流程

        由于库里的接口服务器过于复杂,需要的请查看⽤⼾⼿册: http://docs.websocketpp.org/。

重要的接口在下面用到讲解。

int main()
{   //1. 实例化server对象wsserver_t wssrv;//2. 设置日志等级wssrv.set_access_channels(websocketpp::log::alevel::none);//3. 初始化asio调度器wssrv.init_asio();wssrv.set_reuse_addr(true);//4. 设置回调函数wssrv.set_open_handler(std::bind(wsopen_callback, &wssrv, std::placeholders::_1));wssrv.set_http_handler(std::bind(http_callback, &wssrv, std::placeholders::_1));wssrv.set_message_handler(std::bind(wsmsg_callback, &wssrv, std::placeholders::_1, wssrv.set_close_handler(std::bind(wsclose_callback, &wssrv, std::placeholders::_1));std::placeholders::_2));//5. 设置监听端口wssrv.listen(8085);//6. 开始获取新连接wssrv.start_accept();//7. 启动服务器wssrv.run();return 0;
}

四个回调函数分别为: websocket握⼿成功回调处理函数,http请求回调处理函数,websocket消息回调处理函数,websocket连接关闭回调处理函数。在对应的事件触发后自动调用。

三.简单服务器的搭建

        编写一个简单服务器,对浏览器的请求返回一个简单的http界面。代码如下:

#include <iostream>
#include <string>
#include <websocketpp/server.hpp>
#include <websocketpp/config/asio_no_tls.hpp>typedef websocketpp::server<websocketpp::config::asio> wsserver_t;void print(const std::string &str)
{std::cout << str << std::endl;
}void http_callback(wsserver_t *srv, websocketpp::connection_hdl hdl) {//给客户端返回一个hello world的页面wsserver_t::connection_ptr conn = srv->get_con_from_hdl(hdl);std::cout << "body: " << conn->get_request_body() << std::endl; websocketpp::http::parser::request req = conn->get_request();std::cout << "method: " << req.get_method() << std::endl;std::cout << "uri: " << req.get_uri() << std::endl;std::string body = "<html><body><h1>Hello World</h1></body></html>";conn->set_body(body);conn->append_header("Content-Type", "text/html");conn->set_status(websocketpp::http::status_code::ok);// wsserver_t::timer_ptr tp = srv->set_timer(5000, std::bind(print, "bitejiuyeke"));// tp->cancel();//定时任务的取消,会导致定时任务立即被执行
}
void wsopen_callback(wsserver_t *srv, websocketpp::connection_hdl hdl) {std::cout << "websocket握手成功!!\n";
}
void wsclose_callback(wsserver_t *srv, websocketpp::connection_hdl hdl) {std::cout << "websocket连接断开!!\n";
}
void wsmsg_callback(wsserver_t *srv, websocketpp::connection_hdl hdl, wsserver_t::message_ptr msg) {wsserver_t::connection_ptr conn = srv->get_con_from_hdl(hdl);std::cout << "wsmsg: " << msg->get_payload() << std::endl;std::string rsp = "client say: " + msg->get_payload();conn->send(rsp, websocketpp::frame::opcode::text);
}
int main()
{//1. 实例化server对象wsserver_t wssrv;//2. 设置日志等级wssrv.set_access_channels(websocketpp::log::alevel::none);//3. 初始化asio调度器wssrv.init_asio();wssrv.set_reuse_addr(true);//4. 设置回调函数wssrv.set_http_handler(std::bind(http_callback, &wssrv, std::placeholders::_1));wssrv.set_open_handler(std::bind(wsopen_callback, &wssrv, std::placeholders::_1));wssrv.set_close_handler(std::bind(wsclose_callback, &wssrv, std::placeholders::_1));wssrv.set_message_handler(std::bind(wsmsg_callback, &wssrv, std::placeholders::_1, std::placeholders::_2));//5. 设置监听端口wssrv.listen(8085);//6. 开始获取新连接wssrv.start_accept();//7. 启动服务器wssrv.run();return 0;
}

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue

BlockingQueue BlockingQueue 是Java并发包&#xff08;java.util.concurrent&#xff09;中提供的一个阻塞队列接口&#xff0c;它继承自 Queue 接口。 BlockingQueue 中的元素采用 FIFO 的原则&#xff0c;支持多线程环境并发访问&#xff0c;提供了阻塞读取和写入的操作&a…

视频汇聚平台LntonAIServer视频质量诊断功能--偏色检测与噪声检测

随着视频监控技术的不断进步&#xff0c;视频质量成为了决定监控系统性能的关键因素之一。LntonAIServer新增的视频质量诊断功能&#xff0c;特别是偏色检测和噪声检测&#xff0c;进一步强化了视频监控系统的可靠性和实用性。下面我们将详细介绍这两项功能的技术细节、应用场景…

【AI】Pytorch_损失函数优化器

建议点赞收藏关注&#xff01;持续更新至pytorch大部分内容更完。 本文已达到10w字&#xff0c;故按模块拆开&#xff0c;详见目录导航。 整体框架如下 数据及预处理 模型及其构建 损失函数及优化器 本节目录 损失函数创建损失函数 &#xff08;共18个&#xff09;nn.CrossEnt…

【openwrt-21.02】T750 openwrt MT7916 WPS PBC功能实现

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

MySQL数据备份策略监控:实现方法与最佳实践

数据备份是数据库管理中的重要环节&#xff0c;它确保了在数据丢失或损坏的情况下能够恢复数据。在MySQL中&#xff0c;实施有效的数据备份策略监控对于保障数据安全和业务连续性至关重要。监控不仅可以帮助及时发现备份过程中的问题&#xff0c;还可以确保备份数据的完整性和可…

iOS 收集打印日志

可以将要在Xcode 控制台打印的日志写在沙盒&#xff0c;最后导出分享&#xff0c;进行问题分析。 正式版本不建议使用&#xff0c;避免增加用户内存。配合解决顽固 Bug 可以通过该方法收集打印日志 .h头文件 interface LogManager : NSObject(FSLogManager *)shareInstance; -…

【多场景应用】基于杰发科技AC7840x的Mini LED背光驱动设计

应用场景&#xff1a; 在汽车应用中&#xff0c;Mini LED背光驱动设计主要用于仪表盘、中控屏和车载娱乐系统等显示屏。这项技术可以显著提升显示效果&#xff0c;提供更高的亮度、更深的黑色和更广的色域&#xff0c;使得图像更加生动逼真&#xff0c;尤其在强光和宽温度范围…

Redis 篇-深入了解查询缓存与缓存所带来的问题(读写不一致、缓存穿透、缓存雪崩、缓存击穿)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 本章目录 1.0 什么是缓存 2.0 项目中具体如何添加缓存 3.0 添加缓存后所带来的问题 3.1 读写不一致问题 3.1.1 缓存更新策略 3.1.2 具体实现缓存与数据库的双写一致 3.2 缓存穿…

【日记】想见珍一面怎么就这么难(985 字)

正文 想见珍一面怎么就这么难…… 事故频发。昨天说考试时间跟机票时间冲突了&#xff0c;最后结果出来了&#xff0c;改签了&#xff0c;并且差价不补。我不干&#xff0c;他们也不干。因为上级行给我们行长施压&#xff0c;于是我们行长给我施压。最后要到了国庆之前拔智齿的…

詳細解析軟路由與代理爬蟲池-okeyproxy

什麼是軟路由&#xff1f; 軟路由&#xff0c;顧名思義&#xff0c;就是通過軟體實現的路由器功能。與傳統的硬體路由器不同&#xff0c;軟路由通常是基於PC或單板電腦&#xff08;如樹莓派&#xff09;運行的路由器軟體。 靈活性高&#xff1a;可以根據需求安裝各種插件和服…

华为 HCIP-Datacom H12-821 题库 (6)

有需要题库的可以看主页置顶 V群仅进行学习交流 1.转发表中 FLAG 字段中B 的含义是&#xff1f; A、可用路由 B、静态路由 C、黑洞路由 D、网关路由 答案&#xff1a;C 解析&#xff1a; 可用路由用U 表示&#xff0c;静态路由用 S 表示&#xff0c;黑洞路由用 B 表示&#x…

网站一些标识

1.网站TDK大三标签SEO优化 SEO(Search engine optimzation) 汉译为搜索引擎优化&#xff0c;是一种利用搜索引擎的规则提高网站在有关搜索引擎内自然排名的方式。 ​ SEO的目的是对网站进行深度的优化&#xff0c;从而帮助获取免费的流量&#xff0c;进而在搜索引擎上提升网站…

笔试,牛客.kotori和n皇后​,牛客.AOE还是单体

目录 牛客.kotori和n皇后​编辑 牛客.AOE还是单体 牛客.kotori和n皇后 想起来&#xff0c;我之前还写过n皇后的题&#xff0c;但是这个我开始只能想到暴力解法 判断是不是斜对角线&#xff0c;联想yxb和y-xb,假如在一条线上&#xff0c;那么他们的x和y会对应成比例&#xff0c…

【弱监督时间动作定位】Probabilistic Vision-Language Representation for WSTAL 论文阅读

Probabilistic Vision-Language Representation for Weakly Supervised Temporal Action Localization 论文阅读 Abstract1 Introduction2 RELATEDWORK2.1 Weakly Supervised Temporal Action Localization2.2 Vision Language Pre-training2.3 Probabilistic Representation 3…

RocketMQ高级特性四-消息过滤

目录 前言 Broker端过滤 定义与概述 消息过滤分类 原理机制 使用场景 优缺点 Java代码示例 - Tag过滤 Java代码示例 - SQL92过滤 客户端过滤 定义与概述 原理机制 使用场景 优缺点 Java代码示例 总结 前言 消息过滤是RocketMQ的一项高级特性&#xff0c;它允许…

常见HTTP状态码、APUD响应状态字及含义

目录 一、HTTP状态码 二、APDU指令码 一、HTTP状态码 HTTP状态&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器超文本传输协议响应状态的3位数字代码。 关于HTTP状态码更加详细介绍推荐阅读&#xff1a; http://t.csdnimg.cn/qSJv6http://t.csdnimg.cn/qSJv…

光敏电阻传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.光敏电阻传感器介绍 2.原理图 三、程序设计 main.c文件 ldr.h文件 ldr.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 光敏电阻器是利用半导体的光电导效应制成的一种电阻值随入射光的强弱而改变的电阻器&#xff0c;又称为光…

基于树莓派的儿童音频播发器—Yoto

Raspberry Pi 的开发可能性使吸引人的、以儿童为中心的音频播放器得以成型 Yoto Player 为孩子们提供了拥有和控制的绝佳体验&#xff0c;同时不会增加屏幕时间。得益于 Raspberry Pi 以及我们认可的经销商提供的支持和专业知识&#xff0c;Yoto Player 在英国取得了成功。 Yo…

streamlit示例-极简

登录注册多步骤任务和实时展示结果 封装后的 Streamlit 示例代码 访问演示地址 import streamlit as st import time# In-memory "database" for simplicity users_db {admin: {password: admin123, name: Admin, age: 30, favorite_color: blue} }def register_…

(C++ STL)list类的简单模拟实现与源码展示

list类的简单模拟实现 一、前言二、ListNode 单个节点的成员变量三、ListIterator 迭代器四、ReverseListIterator 迭代器五、list 的成员变量与初始化六、list 部分函数实现inserterase 七、list 源代码 以下代码环境为 VS2022 C。 一、前言 list类 本质上是数据结构中的双向…