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

Qt的websocket客户端和服务器测试(非安全版本)

测试内容:

客户端:

1 连接服务器

2 发送数据

3 处理错误信号

4 监听断开信号

5 接收服务器的数据

 服务器:

1 监听等待客户端连接

2 向指定的客户端发送数据

4 监听断开信号

5 接收客户端的数据

测试界面

工程文件.pro添加的内容:

QT += network websockets

 widget.h文件的内容

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QWebSocketServer>
#include <QWebSocket>
#include <QHostAddress>
#include <QDebug>
#include <QVariant>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);QWebSocketServer *m_server = nullptr;QWebSocket *m_webSocket_client = nullptr;~Widget();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_pushButton_6_clicked();void on_pushButton_5_clicked();
private:Ui::Widget *ui;
};
#endif // WIDGET_H

窗体构造函数:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);m_server = new QWebSocketServer(QStringLiteral("My Server"),QWebSocketServer::NonSecureMode);//处理QWebSocketServer的closed信号connect(m_server, &QWebSocketServer::closed, this, [this](){QWebSocketServer *server = (QWebSocketServer*)sender();while(ui->comboBox->count() > 0){QVariant socketVariant = ui->comboBox->itemData(0);QWebSocket *socket = qvariant_cast<QWebSocket *>(socketVariant);QString item_txt = QString("delete client:%1:%2").arg(socket->peerAddress().toString()).arg(socket->peerPort());ui->textBrowser_4->append(item_txt);socket->close();ui->comboBox->removeItem(0);}});//处理QWebSocketServer的newConnection信号connect(m_server, &QWebSocketServer::newConnection, this, [this](){QWebSocketServer *server = (QWebSocketServer*)sender();QWebSocket *socket = server->nextPendingConnection();connect(socket, &QWebSocket::textMessageReceived, this, [this](const QString &message){this->ui->textBrowser_4->append(message);});//处理QWebSocketServer的新连接客户端的断开信号,用于删除列表框connect(socket,&QWebSocket::disconnected,this,[this](){this->ui->textBrowser_4->append("client disconnected success");QWebSocket *socket = (QWebSocket *)sender();for(int i = 0;i < ui->comboBox->count();i++){QVariant socketVariant = ui->comboBox->itemData(i);QWebSocket *webSocket = qvariant_cast<QWebSocket *>(socketVariant);if(socket == webSocket){ui->comboBox->removeItem(i);break;}}});QString item_txt = QString("%1:%2").arg(socket->peerAddress().toString()).arg(socket->peerPort());QVariant socketVariant = QVariant::fromValue(socket);ui->comboBox->addItem(item_txt,socketVariant);ui->textBrowser_4->append(QString("get a new client %1").arg(item_txt));});//初始化客户端和它的信号m_webSocket_client = new QWebSocket;connect(m_webSocket_client,&QWebSocket::connected,this,[this](){QWebSocket *socket = (QWebSocket*)sender();QString server_info = QString("connect %1:%2 ok").arg(socket->peerAddress().toString()).arg(socket->peerPort());this->ui->textBrowser_2->append(QString("connect server:%1 success").arg(server_info));});connect(m_webSocket_client,&QWebSocket::disconnected,this,[this](){this->ui->textBrowser_2->append("client disconnected success");});connect(m_webSocket_client,QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),this,[this](QAbstractSocket::SocketError error){this->ui->textBrowser_2->append(QString("error:%1").arg(error));});connect(m_webSocket_client, &QWebSocket::textMessageReceived, this, [this](const QString &message){this->ui->textBrowser_2->append(message);});
}

客户端按钮

连接按钮

void Widget::on_pushButton_2_clicked()
{//QUrl serverUrl(QLatin1String("ws://127.0.0.1:12345"));QUrl serverUrl(QLatin1String(this->ui->lineEdit->text().toLatin1()));qDebug() << "begin connect " << serverUrl.toString();m_webSocket_client->open(serverUrl);
}

发送按钮

void Widget::on_pushButton_3_clicked()
{if(m_webSocket_client->state() == QAbstractSocket::ConnectedState){m_webSocket_client->sendTextMessage(this->ui->lineEdit_2->text());}
}

断开按钮 

void Widget::on_pushButton_clicked()
{if(m_webSocket_client->state() == QAbstractSocket::ConnectedState){m_webSocket_client->close();}
}

服务器按钮

 监听按钮

执行m_server->close();竟然不能关闭已经连接的客户端,后来在closed槽中又做了关闭处理。

void Widget::on_pushButton_5_clicked()
{if(m_server->isListening()){m_server->close();ui->pushButton_5->setText(tr("listen"));return;}if(m_server->listen(QHostAddress::Any,ui->lineEdit_4->text().toInt())){qDebug() << "listen port : " << m_server->serverPort() << " ok";ui->pushButton_5->setText(tr("stop"));}else{qCritical() << "listen port : " << m_server->serverPort() << " fail";ui->pushButton_5->setText(tr("listen"));}
}

发送按钮

根据combo列表的选项,向对应的客户端发送消息

void Widget::on_pushButton_6_clicked()
{int index = ui->comboBox->currentIndex();QVariant socketVariant = ui->comboBox->itemData(index);QWebSocket *current_client = qvariant_cast<QWebSocket *>(socketVariant);if(current_client->state() == QAbstractSocket::ConnectedState){current_client->sendTextMessage(this->ui->lineEdit_5->text());qDebug() << "send:" << this->ui->lineEdit_5->text();}else{ui->comboBox->removeItem(index);}
}

小结

相关文章:

Qt的websocket客户端和服务器测试(非安全版本)

测试内容&#xff1a; 客户端&#xff1a; 1 连接服务器 2 发送数据 3 处理错误信号 4 监听断开信号 5 接收服务器的数据 服务器&#xff1a; 1 监听等待客户端连接 2 向指定的客户端发送数据 4 监听断开信号 5 接收客户端的数据 测试界面 工程文件.pro添加的内容&#xff1a;…...

Prometheus运维监控平台之监控指标注册到consul脚本开发、自定义监控项采集配置调试(三)

系列文章目录 运维监控平台搭建 运维监控平台监控标签 golang_Consul代码实现Prometheus监控目标的注册以及动态发现与配置V1版本 文章目录 系列文章目录目的一、监控指标注册到consul的golang脚本开发1、修改settings.yaml文件2、修改config/ocnsul,go文件3、修改core/consul…...

C语言——数组

1.数组的概念 数组是一组相同类型元素的集合&#xff1b; 数组中可以存放1个或多个元素&#xff0c;但数组元素个数不能为0。 同时数组可以分为一维数组和多维数组&#xff0c;多维数组一般常见 是二维数组。 2.一维数组的创建和初始化 一维数组的创建的基本语法&#xff1a; …...

MySQL-09.DDL-表结构操作-查询修改删除

一.查询 二.修改 三.删除 -- DDL&#xff1a;查看表结构 -- 查看&#xff1a;当前数据库下的表show tables ;-- 查看&#xff1a;查看指定的表结构 desc tb_emp;-- 查看&#xff1a;数据库的建表语句 show create table tb_emp;-- DDL:修改表结构 -- 修改&#xff1a;为表tb…...

WileyNJDv5_Template模板无法编译生成pdf文件

文章目录 问题解决办法结果 问题 使用WileyNJDv5_Template模板时&#xff0c;修改tex文件里的内容&#xff0c;按F6编译后&#xff0c;并没有报错&#xff0c;但是编辑后的pdf文件没有生成&#xff0c;因为看文件夹里的pdf文件日期还是以前的日期&#xff0c;所以是旧版的pdf文…...

亿配芯城(ICGOODFIND)教你外贸(海外)推广电子元器件芯片的专用词语

在电子元器件行业&#xff0c;海外推广是企业拓展市场、提升竞争力的重要手段。而在海外推广过程中&#xff0c;恰当运用专用词语能够准确传达产品信息、吸引客户关注&#xff0c;提升推广效果。本文将详细介绍亿配芯城&#xff08;ICGOODFIND&#xff09;电子元器件海外推广中…...

windows和linux的一些使用问题一一记录

文章目录 windows 11 激活wsl文件共享命令互通wslg网络 Hyper-V双系统遇到再记录……… windows 11 激活 然后执行 slmgr /skms kms.03k.org slmgr /atowsl 卡死打开任务管理关闭下就行了 wsl --list -v # 安装的 wsl --list --online #可以安装的wsl -d kali-linux # 启…...

排序算法上——插入,希尔,选择,堆排序

前言&#xff1a; 常见排序方法如下&#xff1a; 本篇将介绍4种排序方法&#xff0c;分别为插入排序&#xff0c;希尔排序&#xff0c;选择排序&#xff0c;堆排序&#xff0c;并分别举例与讲解。 一. 插入排序 1.1 含义与动图分析 插入排序的思想是在有序区间的下一个位置…...

Mycat 详细介绍及入门实战,解决数据库性能问题

一、基本原理 1、数据分片 &#xff08;1&#xff09;、水平分片 Mycat 将一个大表的数据按照一定的规则拆分成多个小表&#xff0c;分布在不同的数据库节点上。例如&#xff0c;可以根据某个字段的值进行哈希取模&#xff0c;将数据均匀的分布到不同的节点上。 这样做的好处…...

FFmpeg源码:avformat_new_stream函数分析

一、avformat_new_stream函数的声明 avformat_new_stream函数定义在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为7.0.1&#xff09;的头文件libavformat/avformat.h中&#xff1a; /*** Add a new stream to a media file.** When demuxing, it is called by the dem…...

【java】深入解析Lambda表达式

Lambda表达式是Java 8引入的一项重要特性&#xff0c;它提供了一种简洁的方式来实现函数式编程。Lambda表达式的使用广泛而且灵活&#xff0c;可以简化代码并提高可读性。本篇文章将深入解析Lambda表达式&#xff0c;包括使用场景、基础学习、代码案例、实现方法和注意事项等方…...

Chromium html<img>对应c++接口定义

<img src"tulip.jpg" alt"上海鲜花港 - 郁金香" /> 1、html_tag_names.json5中接口定义&#xff1a; &#xff08;third_party\blink\renderer\core\html\html_tag_names.json5&#xff09; {name: "img",constructorNeedsCreateElementF…...

卸载Python

1、查看安装框架位置并删除 Sudo rm -rf /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8 2、查看应用并删除 在 /Applications/Python 3.x 看是否存在&#xff0c;如果存在并删除。 3、删除软连接 ls -l /usr/bin/py* 或 ls -…...

算法剖析:二分查找

文章目录 前言二分查找模板朴素模板左右查找模板 一、二分查找二、 在排序数组中查找元素的第一个和最后一个位置三、搜索插入位置四、x 的平方根五、山脉数组的峰顶索引六、寻找峰值七、寻找旋转排序数组中的最小值八、 点名总结 前言 二分查找是一种高效的查找算法&#xff…...

Invoke 和 InvokeRequired以及他们两个的区别

在.NET中&#xff0c;Invoke和InvokeRequired是Windows Forms编程中用于确保线程安全的关键方法和属性。它们通常用在多线程环境中&#xff0c;以确保UI控件的更新操作在创建控件的线程上执行&#xff0c;避免因跨线程操作导致的异常。 InvokeRequired 属性 InvokeRequired属…...

SpringBoot概览及核心原理

Spring Boot 是由Pivotal 团队设计的全新框架&#xff0c;其目的是用来简化 Spring 应用开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使得开发人员不再需要定义一系列样板化的配置文件&#xff0c;而专注于核心业务开发&#xff0c;项目涉及的一些基础设施则交…...

根据basic auth请求https获取token

根据basic auth请求https获取token 对接第三方接口&#xff0c;给了接口文档&#xff0c;但是没有示例代码&#xff0c;postman一直可请求成功&#xff0c;java就是不行。百思不得其解&#xff0c;最后请求公司大神&#xff0c;得到一套秘籍。 第一步 第二步 Authorization&am…...

【基础版】React缓存路由

前言 项目背景 Reactumireact-router5 需求 用户在某一页面操作后点击跳转到其详情页&#xff0c;返回到列表页还是之前操作过的页面&#xff0c;即把页面缓存下来&#xff08;基础版先处理路由缓存&#xff0c;tab页展示先不处理&#xff09; 实践 在布局页面对页面进行…...

Java基础15-Java高级

十五、Java高级 单元测试、反射、注解、动态代理。 1、单元测试 定义&#xff1a;就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1.1 Junit单元测试框架 可以用来对方 法进行测试&#xff0c;它是第三方公司开源出来的(很多开发工具已经集成了Junit框架&…...

selenium工具的几种截屏方法介绍(9)

在使用selenium做自动化的时候&#xff0c;可以对于某些场景截图保存当时的执行情况&#xff0c;方便后续定位问题或者作为一些证据保留现场。 获取元素后将元素截屏 我们获取元素后&#xff0c;使用函数screenshot将元素截屏&#xff0c;参数filename传入完整的png文件名路径…...

【设计模式】深入理解Python中的过滤器模式(Filter Pattern)

深入理解Python中的过滤器模式&#xff08;Filter Pattern&#xff09; 在软件设计中&#xff0c;面对复杂的数据处理需求时&#xff0c;我们常常需要从一组数据中筛选出符合特定条件的子集。**过滤器模式&#xff08;Filter Pattern&#xff09;**是一种能够简化这种操作的设…...

vue的动态组件 keep-alive

1. 什么是动态组件 动态组件指的是 动态切换组件的显示与隐藏 2. 如何实现动态组件渲染 vue提供了一个内置的<component>组件&#xff0c;专门用来实现动态组件的渲染。 作用&#xff1a;组件的占位符is的值表示要渲染的组件 示例代码如下&#xff1a; Left.vue的代…...

现代框架开发官网

一、项目背景 维护过 灵犀官网、企业邮官网、免费邮官网 均使用 jquery webpack多页面打包的方式 开发起来较为繁琐 新的官网项目&#xff0c;想使用现代前端框架&#xff0c;但SPA应用不利于SEO 使用SSR方案又依赖运维&#xff0c;增加维护和沟通成本 二、SSG vs 预渲染 S…...

一篇文章快速认识YOLO11 | 关键改进点 | 安装使用 | 模型训练和推理

前言 本文分享YOLO11的关键改进点、性能对比、安装使用、模型训练和推理等内容。 YOLO11 是 Ultralytics 最新的实时目标检测器&#xff0c;凭借更高的精度、速度和效率重新定义了可能性。 除了传统的目标检测外&#xff0c;YOLO11 还支持目标跟踪、实例分割、姿态估计、OBB…...

AtCoder Beginner Contest 375(A,B,C,D,E,F)(大模拟,前缀和,dp,离线处理,Floyd)

比赛链接 AtCoder Beginner Contest 375 A题 代码 #pragma GCC optimize("O2") #pragma GCC optimize("O3") #include <bits/stdc.h> using namespace std; #define int long long const int N 2e5 5, M 1e6 5; const int inf 0x3f3f3f3f3f…...

认识maven

什么是 Maven&#xff1f; Maven 是一个开源的项目管理工具&#xff0c;主要用于 Java 项目的构建、依赖管理和项目生命周期管理。它提供了一种标准的项目结构和管理流程&#xff0c;使得开发人员能够更轻松地管理项目的构建过程&#xff0c;提高代码的可重用性和可维护性。 …...

OSINT技术情报精选·2024年10月第2周

OSINT技术情报精选2024年10月第2周 2024.10.16版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、亿欧智库&#xff1a;《2024中国高精定位服务产业白皮书》 报告的主要内容如下&#xff1a; 产业背景&#xff1a;在“北斗”发展态势的…...

中企通信赋能中信戴卡入选工信部颁发的2023年工业互联网试点示范名单

2024年10月17日&#xff0c;北京-随着工业互联网的迅猛发展&#xff0c;网络安全已成为国家关注的重点议题之一。日前&#xff0c;工业和信息化部&#xff08;工信部&#xff09;公布了2023年工业互联网试点示范名单&#xff0c;中企网络通信技术有限公司&#xff08;简称“中企…...

【C语言】函数的声明与定义

函数的声明 用户自定义函数需要在main函数之前进行声明&#xff0c;用分号结尾。 函数的定义 用户自定义函数在main函数之后进行定义&#xff0c;需要写出具体形参的变量名。注意函数的返回值和返回值类型要一一对应。 函数的调用 调用时&#xff0c;直接使用函数名进行调用&am…...

游戏如何应对薅羊毛问题

在大众眼里&#xff0c;“薅羊毛”是指在电商领域&#xff0c;“羊毛党”利用平台、商家的促销规则&#xff0c;低价获取商品和服务的行为。如前不久“小天鹅被一夜薅走7000万”的案例震惊全网。 然而实际上&#xff0c;“薅羊毛”现象不仅存在于电商场景&#xff0c;在游戏中…...