websocket初始化

websocket初始化

前言

上一集我们HTTP的ping操作就可以跑通了,那么我们还有一个协议---websocket,我们在这一集就要去完成我们websocket的初始化。

分析

我们在初始化websocket的之前,我们考虑一下,我们什么时候就要初始化我们的websocket?

我们是不是应该在程序一启动,我们就和我们的websocket的服务端那边建立连接?

那么我们就需要把初始化websocket的方法直接放在我们NetClient的构造函数当中,只要我们一创建一个NetClient就会直接初始化我们的websocket。

客户端

initWebsocket

我们初始化websocket需要考虑的只有两个因素。

第一,websocket的五种信号的处理,我们需要使用信号槽对五种信号进行处理。

第二,我们需要连接服务器。

我们的五种信号为:

  • 建立连接之后connected
  • 断开连接之后disconnected
  • 连接出错的情况 errorOccurred
  • 收到 文本消息 textMessageReceived
  • 收到二进制消息 binaryMessageReceived
void NetClient::initWebsocket()
{//信号槽connect(&webSocketClient, &QWebSocket::connected, this, [=](){LOG() <<"websocket 连接成功!";});connect(&webSocketClient, &QWebSocket::disconnected, this, [=](){LOG() <<"websocket 连接断开!";});connect(&webSocketClient, &QWebSocket::errorOccurred,  this, [=](QAbstractSocket::SocketError error){LOG() <<"websocket 连接失败! 错误原因:" << error;});connect(&webSocketClient, &QWebSocket::textMessageReceived, this, [=](const QString& message){LOG() <<"websocket 收到文本消息!message=" << message;});connect(&webSocketClient, &QWebSocket::binaryMessageReceived, this, [=](const QByteArray& byteArray){LOG() <<"websocket 收到二进制消息! length:" << byteArray.length();//todo:});//服务器连接webSocketClient.open(WEBSOCKET_URL);
}

这里我们二进制就只打印长度,后续还有内容需要完成,先不讲。

服务端

我们的服务端的websocket也是需要单例模式,提醒一下,我们是持久化的连接的哦!

我们在构造函数里,给websocket设置服务器的名字,以及让websocket的安全模式设置为非安全模式。意味着这个 WebSocket 服务器不会使用加密连接(即不使用 WSS,而是使用 WS)。如果你需要加密连接,可以使用 QWebSocketServer::SecureMode,但这通常需要额外的配置,比如 SSL/TLS 证书。

class WebsocketServer : public QObject{Q_OBJECTprivate:static WebsocketServer* instance;WebsocketServer(): websocketServer("websocket server", QWebSocketServer::NonSecureMode){}QWebSocketServer websocketServer;public:static WebsocketServer* getInstance();bool init();};

init

我们需要用信号槽来建立我们的新连接。新连接之后我们就获取到用来通信的socket对象,之后我们还是像客户端的代码有四种信号。我们最后需要绑定端口启动我们的服务,当然我们监听的是我们的8001的端口号,这个也是我们在NetClient里面规定的。

bool WebsocketServer::init()
{//信号槽connect(&websocketServer, &QWebSocketServer::newConnection, this, [=](){//连接建立成功qDebug() << "[websocket] 连接建立成功!";//获取到用来通信的socket对象QWebSocket* socket = websocketServer.nextPendingConnection();//剩余信号处理connect(socket, &QWebSocket::disconnected, this, [=](){qDebug() << "[websocket] 连接断开!";});connect(socket, &QWebSocket::errorOccurred, this, [=](QAbstractSocket::SocketError error){qDebug() << "[websocket] 连接失败! 错误原因" << error;});connect(socket, &QWebSocket::textMessageReceived, this, [=](const QString& message){qDebug() << "[websocket] 收到文本数据!message=" << message;});connect(socket, &QWebSocket::binaryMessageReceived, this, [=](const QByteArray& byteArray){qDebug() << "[websocket] 收到二进制数据! length=" << byteArray.length();});});//绑定端口启动服务bool ok = websocketServer.listen(QHostAddress::Any, 8001);return ok;
}

测试

WebsocketServer* websocketServer = WebsocketServer::getInstance();if(!websocketServer->init()){qDebug() << "websocket 服务器启动失败!";return 1;}qDebug() << "websocket 服务器启动成功!";
NetClient::NetClient(model::DataCenter *dataCenter):dataCenter(dataCenter)
{initWebsocket();
}

这样,我们先启动服务端,再启动客户端就可以自动连接我们的websocket了。

看看我们的测试结果。

那么我们就完成了这一集的任务,那么我们期待下一集!

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

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

相关文章

Git在版本控制中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Git在版本控制中的应用 Git在版本控制中的应用 Git在版本控制中的应用 引言 Git 概述 定义与原理 发展历程 Git 的关键技术 分布…

[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决

目录 一. 多线程下使用ArrayList 1.1. 自行判断加锁 1.2 使用Collections.synchronizedList()套壳加锁 1.3 CopyOnWriteArrayList类 二. 总结 一. 多线程下使用ArrayList 多线程下使用ArrayList会涉及到线程安全问题, 例如: public static void main(String[] args) thro…

python——面向对象

一、面向对象编程 1.1 面向过程与面向对象 面向过程和面向对象都是一种编程方式&#xff0c;只不过再设计上有区别。 1.1.1 面向过程pop&#xff1a; 举例&#xff1a;孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃…

【缺陷检测】Anomaly Detection via Reverse Distillation from One-Class Embedding

论文地址 代码地址 动机 论文针对传统的知识蒸馏的方案提出了一个问题&#xff1a;认为之前的&#xff08;基于像素点的重建&#xff09;方案[1,2]容易阻碍异常表现的多样性 传统的知识蒸馏teacher和student的网络架构很相似或者几乎相同而且teacher和student的输入流都是…

【PHP】ThinkPHP基础

下载composer ComposerA Dependency Manager for PHPhttps://getcomposer.org/ 安装composer 查看composer是否安装 composer composer --version 安装 ThinkPHP6 如果你是第一次安装的话&#xff0c;首次安装咱们需要打开控制台&#xff1a; 进入后再通过命令,在命令行下面&a…

SpringBoot(十八)SpringBoot集成Minio

项目上传文件集成一下Minio,下面是我在项目中集成Minio的全过程。 首先介绍一下Minio:MinIO是高性能的对象存储,单个对象最大可达5TB。适合存储图片、视频、文档、备份数据、安装包等一系列文件。是一款主要采用Golang语言实现发开的高性能、分布式的对象存储系统。客户端支…

宗馥莉的接班挑战:内斗升级,竞品“偷家”

内斗不止&#xff0c;外患环伺&#xff0c;情怀助力娃哈哈短暂回暖&#xff0c;但市场认可与持续增长仍充满不确定性。 转载&#xff1a;原创新熵 作者丨晓伊 编辑丨蕨影 一波未平&#xff0c;一波又起。继换办公楼、逼员工签新合同和宗馥莉疑似出走等事件后&#xff0c;娃哈哈…

K8S单节点部署及集群部署

1.Minikube搭建单节点K8S 前置条件&#xff1a;安装docker&#xff0c;注意版本兼容问题 # 配置docker源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo# 安装docker环境依赖 yum install -y yum-utils device-m…

MySQL —— MySQL逻辑架构与查询过程

文章目录 MySQL逻辑架构整体分为三层连接层服务层查询缓存解析器优化器执行器 存储引擎层系统文件层 MySQL 查询过程查询过程框图 博客1 博客2 MySQL逻辑架构整体分为三层 最上层为客户端层&#xff0c;并非MySQL所独有&#xff0c;诸如&#xff1a;连接管理、授权认证、权限校…

【大数据学习 | HBASE高级】storeFile文件的合并

Compaction 操作分成下面两种&#xff1a; Minor Compaction&#xff1a;是选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile&#xff0c;对于删除、过期、多余版本的数据不进行清除。 Major Compaction&#xff1a;是指将所有的StoreFile合并成一个StoreFile&am…

微服务day08

Elasticsearch 需要安装elasticsearch和Kibana&#xff0c;应为Kibana中有一套控制台可以方便的进行操作。 安装elasticsearch 使用docker命令安装&#xff1a; docker run -d \ --name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \ //设置他的运行内存空间&#x…

操作系统lab4-页面置换算法的模拟

操作系统lab4-页面置换算法的模拟 文章目录 操作系统lab4-页面置换算法的模拟实验目的实验内容实验分析 代码测试用例运行结果 实验目的 1、掌握请求分页存储管理的常用理论&#xff1a;页面置换算法。 2、理解请求分页中的按需调页机制。 实验内容 独立地用高级语言编写和…

react-redux useSelector钩子 学习样例 + 详细解析

&#xff08;一&#xff09;react-redux useSelector 学习样例 详细解析 创建一个新项目&#xff0c;将依赖正确安装&#xff1a; npx create-react-app my-redux-app cd my-redux-app# 安装 Redux 和 React-Redux npm install redux react-redux# 安装 ajv npm install ajv#…

IP数据云 识别和分析tor、proxy等各类型代理

在网络上使用代理&#xff08;tor、proxy、relay等&#xff09;进行访问的目的是为了规避网络的限制、隐藏真实身份或进行其他的不正当行为。 对代理进行识别和分析可以防止恶意攻击、监控和防御僵尸网络和提高防火墙效率等&#xff0c;同时也可以对用户行为进行分析&#xff…

《Django 5 By Example》阅读笔记:p76-p104

《Django 5 By Example》学习第4天&#xff0c;p76-p104总结&#xff0c;总计29页。 一、技术总结 1.环境变量管理 这里作者使用的是&#xff1a;python-decouple&#xff0c;本人在实际项目中使用的是python-dotenv&#xff0c;这里只是简单的使用&#xff0c;感觉两者差不…

【IC每日一题:IC常用模块--RR/handshake/gray2bin】

IC每日一题&#xff1a;IC常用模块--RR/handshake/gray2bin 1 RR仲裁器2 异步握手信号处理3 格雷码和二进制相互转换 1 RR仲裁器 应用&#xff1a;在多个FIFO请求pop时存在仲裁策略&#xff0c;还有比如多master申请总线控制权的仲裁等这些应用场合&#xff1b;假如当前是最高…

【Visual Studio】使用VS调试(Debug)

确保在Debug模式下而不是Release 打断点(break point) 直接在有代码的行前单击&#xff0c;会出现红色的点(再次单击会取消)&#xff1b;或者光标停留在某行&#xff0c;按F9 这意味着程序当执行到这一行时会终止 在打完断点后点击”本地Windows调试器“或者按F5 往下翻会…

基于RK3568J多网口电力可信物联网关解决方案

前言 随着工业物联网的普及和功能越来越强大&#xff0c;边缘计算网关应运而生。 边缘计算有效降低了云端服务器的负载、大大降低了带宽的占用&#xff0c;同时也为本地化的区域自治提供了便利条件。 边缘计算网关&#xff0c;完美地发挥了“边”与“端” 结合优势&#xff0c…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…

SpringBoot实战(三十一)集成iText5,实现RSA签署PDF

目录 一、什么是电子签章?1.1 定义1.2 电子签章的工作原理1.3 电子签章的优势二、准备工作:证书生成、印章生成2.1 证书生成2.2 印章生成三、Java代码实现 RSA 签署 PDF3.1 坐标签署3.2 关键字签署3.3 日期签署3.4 骑缝章签署3.5 文本域签署一、什么是电子签章? 1.1 定义 电…