当前位置: 首页 > news >正文

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了。

看看我们的测试结果。

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

相关文章:

websocket初始化

websocket初始化 前言 上一集我们HTTP的ping操作就可以跑通了&#xff0c;那么我们还有一个协议---websocket&#xff0c;我们在这一集就要去完成我们websocket的初始化。 分析 我们在初始化websocket的之前&#xff0c;我们考虑一下&#xff0c;我们什么时候就要初始化我们…...

uniapp ios app以framwork形式接入sentry

一、下载Sentry mac终端输入&#xff1a;vim Podfile修改Podfile: platform :ios, 11.0 target YourApp douse_frameworks! # This is importantpod Sentry, :git > https://github.com/getsentry/sentry-cocoa.git, :tag > 8.40.1 end执行&#xff1a;pod install下载…...

⾃动化运维利器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…...

若依笔记(十一):芋道多租户限制与修改

目录 多租户实现 哪些表是多租户的? YudaoTenant自动装载类 租户隔离的sql在哪? 如何修改成无租户隔离 全局修改 表级别 请求RUL级别 芋道比若依多了租户概念,这也是因为它增加很多业务系统,首先后台管理系统肯定是多租户的,这意味着如商城系统的产品管理SPU、库存…...

hive 统计各项目下排名前5的问题种类

实现指定某项目下的数据效果图如下所示&#xff1a; 其中 ABCDE 为前5名的问题种类&#xff0c;其中A问题有124个&#xff08;出现了124次&#xff09; 数据说明&#xff1a; 整个数据集 包含很多项目一个项目 包含很多问题一个问题 选项 可认为是 类别值&#xff0c;所有出…...

HBase 安装与基本操作指南

以下是关于 Apache HBase 安装、配置以及简单操作的详细指南&#xff1a; HBase 简介 Apache HBase 是一个基于 Hadoop 的分布式数据库&#xff0c;擅长处理大规模、结构化的海量数据。它采用行列式存储方式&#xff0c;与 Hadoop 和 HDFS 紧密结合&#xff0c;是支持大数据实…...

Spring Boot应用中的文件压缩与解压技术实践

在构建Spring Boot应用时&#xff0c;文件压缩与解压是处理大量数据、优化存储和传输速度的常用技术。本文旨在深入探讨Spring Boot应用中文件压缩与解压的实现方法&#xff0c;包括常见压缩算法的选择、Spring Boot中的实现策略以及实际应用场景中的最佳实践。 引言 随着大数…...

D69【 python 接口自动化学习】- python 基础之数据库

day69 Python 执行 SQL 语句 学习日期&#xff1a;20241115 学习目标&#xff1a; MySQL 数据库&#xfe63;- Python连接redis 学习笔记&#xff1a; redis数据库的用途 使用Python访问redis数据库 使用Python对redis数据库进行读写操作 总结 1. redis是一款高性能的键…...

410. 分割数组的最大值

目录 题目解法 题目 给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k 个非空的连续子数组&#xff0c;使得这 k 个子数组各自和的最大值 最小。 返回分割后最小的和的最大值。 子数组 是数组中连续的部份。 解法 int splitArray(vector<in…...

Azure pipeline 通过git命令修改文件

步骤及解释 设置git用户名 git config --global user.email "useremail" git config --global user.name "username" 获取branch $branch "$(Build.SourceBranch)" -replace "refs/heads/" "$(Build.SourceBranch)"&a…...

LeetCode74. 搜索二维矩阵(2024冬季每日一题 6)

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…...

BPMN 2.0详细介绍

BPMN 2.0&#xff08;Business Process Model and Notation 2.0&#xff09;是一个标准化的图形化建模语言&#xff0c;用于描述业务流程和工作流。它是由 Object Management Group (OMG) 制定的&#xff0c;旨在提供一种标准化的方式&#xff0c;帮助企业和开发者清晰地建模、…...

web——upload-labs——第四关——.htaccess文件绕过

先尝试直接上传一个普通的一句话木马 显示此文件不允许上传&#xff0c;这道题并没有提示不允许上传什么后缀的文件&#xff0c;经过尝试&#xff0c;基本上所有后缀能够被解析为php语句执行的文件都不能成功上传。试试正常的图片能不能上传&#xff1a; 我们再来试试图片马能不…...

36.矩阵格式的等差数列 C语言

第一行&#xff0c;每个数差2&#xff0c;之后是3、4、5&#xff0c;最后一行是10 仅仅是练习目的 #define _CRT_SECURE_NO_WARNINGS // 禁用在 Visual Studio 中有关不安全函数的警告 #include <stdio.h> // 引入标准输入输出库int main() {int i; // 外层循环的变量…...

Java 语言的强大特性

一、面向对象 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;Java 完全遵循这一范式&#xff0c;并具备封装、继承和多态三大核心特性。 1. 封装 封装是将数据和操作封装在类中&#xff0c;通过访问修饰符&#xff08;如 public、private、protected&am…...

ElementUI的日期组件中禁止选择小时、分钟、秒

分不同版本&#xff0c;如果你是elementplus&#xff0c;也就是vue3版本&#xff0c;你就直接可用方案1&#xff1b;如果你是vue2版本&#xff08;扒拉了一下源码&#xff0c;组间不支持&#xff09;&#xff0c;方案2、3都行&#xff0c;具体看自己需求。 1、‌使用:disable-…...

4.2 Android NDK 基础概念

1 JavaVM和JNIEnv JNI 定义了两个关键数据结构&#xff0c;JavaVM和JNIEnv。这两者本质上都是指向函数表指针的指针。&#xff08;在 C 版本中&#xff0c;它们是具有指向函数表的指针的类&#xff0c;以及指向该表的每个 JNI 函数的成员函数。&#xff09;JavaVM提供了“调用接…...

PIL包在Python图像处理中的应用

诸神缄默不语-个人CSDN博文目录 PIL&#xff08;Python Imaging Library&#xff09;是Python中一个强大的图像处理库&#xff0c;尽管其已不再更新&#xff0c;但其后续版本Pillow提供了更多的功能和更好的兼容性。本文将重点介绍Pillow库中的open()函数、fromarray()函数以及…...

ArcGIS Pro ADCore DAML

ArcGIS Pro ADCore DAML ArcGIS Pro SDK - ADCore.daml https://download.csdn.net/download/szy13323042191/89997391...

Clip结合Faiss+Flask简易版文搜图服务

一、实现 使用目录结构&#xff1a; templates ---upload.html faiss_app.py 前端代码&#xff1a;upload.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&quo…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...