websocket初始化

devtools/2024/11/15 16:35:01/

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.ppmy.cn/devtools/134207.html

相关文章

【NOIP提高组】潜伏者

【NOIP提高组】潜伏者 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; R国和S国正陷入战火之中&#xff0c;双方都互派间谍&#xff0c;潜入对方内部&#xff0c;伺机行动。 历尽艰险后&#xff0c;潜伏于 S 国的R 国间谍小C 终于摸清了S 国…

Spring Boot框架:计算机课程管理的工程认证之桥

3系统分析 3.1可行性分析 通过对本基于工程教育认证的计算机课程管理平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于工程教育认证的计算机课程管理平…

蓝桥杯每日真题 - 第13天

题目&#xff1a;&#xff08;删边问题&#xff09; 题目描述&#xff08;14届 C&C B组F题&#xff09; 解题思路&#xff1a; 图的构建&#xff1a;使用邻接链表表示图&#xff0c;边的起点和终点分别存储在数组中&#xff0c;以支持高效的遍历。 Tarjan算法&#xff1a…

Spark 共享变量:广播变量与累加器解析

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

力扣-Hot100-哈希【算法学习day.30】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

浅谈React的虚拟DOM

React的虚拟DOM&#xff1a;揭秘高效渲染的秘密 在React中&#xff0c;虚拟DOM&#xff08;Virtual DOM&#xff09;是一个核心概念&#xff0c;它是React能够提供高效渲染和更新的关键。虚拟DOM是一个轻量级的JavaScript对象&#xff0c;表示真实的DOM树。通过使用虚拟DOM&am…

Python工程加密打包(基于pyinstaller 6.11.1和pyarmor 9.0.5)(202411)

近期编写的PyQt客户端需要交付了&#xff0c;在交付之前面临如下两个问题&#xff1a;第一是将程序打包成exe&#xff0c;第二是对程序进行加密&#xff0c;毕竟生成的pyc文件是能被反编译出来的&#xff0c;甚至连注释都在。 联想到同样是脚本语言的Javascript采用混淆技术进行…

Vue的基础使用

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架…