Qt QWebSocket讲解

QWebSocket 是 Qt 框架中用于处理 WebSocket 通信的类。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。这使得客户端和服务器之间可以进行实时交互,而无需频繁地建立和关闭连接。

QWebSocket 的基本使用

  1. 创建 QWebSocket 对象

    • 你可以创建一个 QWebSocket 对象,然后连接到服务器。
  2. 信号和槽

    • QWebSocket 提供了一系列信号,用于处理连接状态、接收消息等事件。
    • 你可以连接这些信号到适当的槽函数,以处理各种事件。
  3. 发送和接收消息

    • 使用 sendTextMessage 方法发送文本消息。
    • 接收到的消息可以通过信号 textMessageReceived 进行处理。

代码示例

以下是一个简单的 QWebSocket 客户端示例,它连接到 WebSocket 服务器并发送/接收消息:

#include <QCoreApplication>
#include <QWebSocket>

class WebSocketClient : public QObject
{
    Q_OBJECT
public:
    WebSocketClient(QObject *parent = nullptr)
        : QObject(parent)
    {
        webSocket = new QWebSocket();
        connect(webSocket, &QWebSocket::connected, this, &WebSocketClient::onConnected);
        connect(webSocket, &QWebSocket::textMessageReceived, this, &WebSocketClient::onTextMessageReceived);
        connect(webSocket, &QWebSocket::disconnected, this, &WebSocketClient::onDisconnected);
        connect(webSocket, &QWebSocket::pong, this, &WebSocketClient::onPang);
        webSocket->open(QUrl("ws://124.222.224.186:8800"));//("ws://your-websocket-server-url")
    }

    ~WebSocketClient(){
        if(webSocket){
            delete webSocket;
            webSocket = nullptr;
        }
    }

public slots:
    void onConnected()
    {
        qDebug() << "Connected to server";
        webSocket->sendTextMessage("Hello, WebSocket server!");
    }

    void onTextMessageReceived(const QString &message)
    {
        qDebug() << "Received message:" << message;
    }

    void onDisconnected()
    {
        qDebug() << "Disconnected from server";
    }

    void onPang(quint64 elapsedTime, const QByteArray& /*payload*/)
    {
        //复位pong延时
        /*mPongDelayTime = 0;
        //通过延迟时间判断信号强度
        int lSigLevel = HMIDataType::Signal_Level0;
        if(elapsedTime < SIGNAL_LEVEL4_VALUE)
            lSigLevel = HMIDataType::Signal_Level4;
        else if(elapsedTime < SIGNAL_LEVEL3_VALUE)
            lSigLevel = HMIDataType::Signal_Level3;
        else if(elapsedTime < SIGNAL_LEVEL2_VALUE)
            lSigLevel = HMIDataType::Signal_Level2;
        else if(elapsedTime < SIGNAL_LEVEL1_VALUE)
            lSigLevel = HMIDataType::Signal_Level1;
        else
            lSigLevel = HMIDataType::Signal_Level0;
        //设置信号强度
        RcUtilsGlobal::GetInstance()->setSignalLevel(lSigLevel);*/
    }

private:
    QWebSocket *webSocket;
};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    WebSocketClient client;

    return a.exec();
}

运行结果: 

在这个示例中:

  • WebSocketClient 类继承自 QObject,并包含一个 QWebSocket 对象。
  • 我们连接了 QWebSocket 的几个关键信号到相应的槽函数。
  • 当 WebSocket 连接到服务器时,onConnected 槽会被调用,并发送一条消息给服务器。
  • 当收到来自服务器的消息时,onTextMessageReceived 槽会被调用。
  • 如果与服务器的连接断开,onDisconnected 槽会被调用。

确保将 "ws://your-websocket-server-url" 替换为你实际要连接的 WebSocket 服务器的 URL。

这个示例只是一个起点,你可以根据需要扩展它,添加更多的功能和错误处理。

知识点补充:

WebSocket 地址(通常称为WebSocket URL)通常遵循 ws://(非加密连接)或wss://(加密连接,即WebSocket Secure)的协议格式。在选择WebSocket地址时,你需要确保这个地址是有效的,并且服务器正在监听该地址上的连接。

在实际应用中,WebSocket地址由服务器管理员或文档提供。如果你正在开发一个WebSocket客户端,并需要连接到某个WebSocket服务器,你应该从服务器管理员或相关文档中获取正确的WebSocket地址。

请注意,WebSocket地址可能包含特定的路径或查询参数,这取决于服务器的配置和需求。例如,一个WebSocket地址可能看起来像这样:

ws://example.com/socketserver
或者带有查询参数的地址:
ws://example.com/socketserver?param1=value1&param2=value2

在开发过程中,确保你有权限连接到该WebSocket服务器,并且服务器已正确配置以接受来自你的客户端的连接。如果你没有自己的WebSocket服务器,但想要测试你的客户端,你可以寻找一些公开的WebSocket测试服务器或使用在线的WebSocket echo服务。

最后,由于安全性和隐私性的考虑,始终确保你连接的WebSocket服务器是可信的,并且加密连接(使用wss://)在需要时得到使用。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LoRa物联网行业解决方案 1

1 行业应用 智慧停车 智能抄表 智慧牧场 智能生产 智能物流 智能健康 2 物联网智慧农场项目需求 3 为什么选lora&#xff1f; 4 设计 5 模块性能参数 sx1278 lora扩频无线模块 SEMTECH公司SX1278芯片 LoRa 扩频技术 通信距离10000米 SPI通信接口 mcu选型 硬件平台介绍 …

【Java多线程】7——阻塞队列线程池

7 线程池 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x…

卷积篇 | 引入可改变核卷积AKConv:具有任意采样形状和任意数目参数的卷积核

前言:Hello大家好,我是小哥谈。可改变核卷积(AKConv)是一种深度学习中的卷积神经网络(CNN)结构,它可以根据需要自适应地改变其卷积核。AKConv相对于传统的卷积神经网络,具有更高的灵活性和适应性,可以在不同的任务和数据集上实现更好的性能。🌈 目录 🚀1…

【SpringBoot】-- Spring Validation参数校验框架

SPringle Validation是Spring提供的一个参数校验框架&#xff0c;使用预定义的注解完成参数校验。 一、自定义参数校验 1、引入Spring Valiation依赖 <!-- validation依赖--><dependency><groupId>org.springframework.boot</groupId><arti…

提升 RAG 效果的实践

提升 RAG 效果的实践 0. 引言1. 测试数据2. cohere/embed-multilingual-v3.0 的几组测试结果2-1. 第1组测试2-2. 第2组测试 3. BAAI/bge-m3 的几组测试结果3-1. 第1组测试 0. 引言 AI 大语言模型的主要应用方式之一就是 RAG&#xff0c;接下来计划陆续分享工作中提升 RAG 效果…

数据库之迁移常规操作(Mongodb篇)

一、部署mongodb数据库。 注&#xff1a;采用docker容器进行安装 部署详情参考此文 》》https://blog.csdn.net/u014642921/article/details/136022683 二、在admin用户创建testdb文档插入两条数据 admin> db.testdb.insertMany([{name:"1",age:1,addr:"…

【IP组播】PIM-SM的RP、RPF校验

目录 一&#xff1a;PIM-SM的RP 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置IGP 3.配置PIM-SM和静态RP 4.配置动态RP 5.配置Anycast RP 二&#xff1a; RPF校验 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置IGP 3.配置PIM-DM 4.RPF校…

centos7.5安装gitlab-runner,配置CI/CD流水线

一般不建议gitlab-server和gitlab-runner装在同一台服务器 第一步&#xff1a;安装gitlab-runner,最好和gitlab实例版本一致 # 下载官方gitlab-runner安装脚本 curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | s…

springboot简历系统

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;简历系统当然也不能排除在外。简历系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采用…

Sui现已推出共享对象删除功能

临时共享对象是Sui的一项新功能&#xff0c;使开发人员能够删除共享对象。这项新功能增加了开发人员可用的工具集&#xff0c;以及他们与共享对象交互的方式&#xff0c;提升了成本效率和对象管理的表达能力。 启用共享对象的临时创建和随后的删除功能&#xff0c;一旦其用途达…

vCenter 提示 Root user password expired 解决办法

vCenter root 密码过期告警 vCenter 一般部署为一台虚拟机&#xff0c;该 root 用户是 vCenter 虚拟机SSH登录的用户&#xff0c;以及 vcenter VAMI的登录用户&#xff0c;该密码默认过期时间为90天。 vCenter涉及多个登录界面&#xff0c;本次提示root密码过期的用户涉及后两…

【MySQL】聊聊全表查询会不会把数据库内存打爆

是实际的开发中&#xff0c;可能因为误操作。可能会执行一个全表扫描的SQL&#xff0c;如果这个表的数据比较大&#xff0c;比如10G&#xff0c;但是数据库内存8G &#xff0c;会不会将这个数据库内存打爆。带着这个问题&#xff0c;我们来深入学习下。其实主要就是一个server层…

echarts 图表/SVG 图片指定位置截取

echarts 图表/SVG 图片指定位置截取 1.前期准备2.图片截取3.关于drawImage参数 需求&#xff1a;如下图所示&#xff0c;需要固定头部legend信息 1.前期准备 echarts dom渲染容器 <div :id"barchart id" class"charts" ref"barchart">&…

1695. 删除子数组的最大得分-力扣(滑动窗口)

给你一个正整数数组 nums &#xff0c;请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个 子数组可获得的 最大得分 。 如果数组 b 是数组 a 的一个连续子序列&#xff0c;即如果它等于 a[l],a[l1],…,a[r] &#xff0…

Map和List输入的两种不同json格式

一、List to json格式 [{"type":"top.lovemom.pojo.ESP8266","devicePosition":"家里的阳台","deviceRemark":"我的设备1","publicIp":"127.0.0.1","userEmail":"123bggb.to…

Verilog基础【一】

文章目录 1.1 第一个verilog设计1.2 Verilog 简介1.3 Verilog环境搭建1.4 Verilog 设计方法设计方法设计流程 2.1 Verilog 基础语法格式注释标识符与关键字 2.2 Verilog 数值表示数值种类整数数值表示方法实数表示方法十进制&#xff1a;科学计数法&#xff1a; 字符串表示方法…

【论文极速读】 指令微调BLIP:一种对指令微调敏感的Q-Former设计

【论文极速读】 指令微调BLIP&#xff1a;一种对指令微调敏感的Q-Former设计 FesianXu 20240330 at Tencent WeChat search team 前言 之前笔者在[1]中曾经介绍过BLIP2&#xff0c;其采用Q-Former的方式融合了多模态视觉信息和LLM&#xff0c;本文作者想要简单介绍一个在BLIP2…

java多数据源几种实现方式以及demo

提示&#xff1a;多数据源实现方式、多数据源的使用场景。AbstractRoutingDataSource、DynamicDataSource框架、mybatisplus的Intercepter插件、java中多数据源的几种实现方式、mybatisPlus的插件实现多数据源 文章目录 前言一、多数据源的几种实现方式二、使用场景三、核心原理…

k8s1.28.8版本配置Alertmanager报警方式(邮件,企业微信)

文章目录 总结部署流程 Alertmanager 三大核心1. 分组告警2. 告警抑制3. 告警静默 报警过滤静默通知方案一&#xff1a;方案二&#xff1a; 抑制报警规则案例一 参考文档 自定义路由告警&#xff0c;分来自不同路由的告警&#xff0c;艾特不同的人员进行区分修改 alertmanager …

中缀转后缀表达式

思路分析 遇到数字&#xff0c;直接输出遇到符号 栈为空&#xff0c;符号直接入栈若为 ( &#xff0c;则直接入栈用当前符号和栈顶符号比较优先级 当前符号 > 栈顶符号&#xff0c;当前符号直接入栈&#xff0c;结束当前符号 < 栈顶符号,栈顶符号出栈并输出&#xff0c;…