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

QT:一个TCP客户端自动连接的测试模型

版本 1:没有取消按钮

 测试效果:

缺陷:

无法手动停止

测试代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.19)
project(AutoConnect LANGUAGES CXX)find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets Network)qt_standard_project_setup()qt_add_executable(AutoConnectWIN32 MACOSX_BUNDLEmain.cppwidget.hwidget.ui
)target_link_libraries(AutoConnectPRIVATEQt::CoreQt::WidgetsQt6::Network
)include(GNUInstallDirs)install(TARGETS AutoConnectBUNDLE  DESTINATION .RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)qt_generate_deploy_app_script(TARGET AutoConnectOUTPUT_SCRIPT deploy_scriptNO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})

main.cpp 

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QProgressDialog>
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QTextBrowser>
#include <QMouseEvent>
#include <QLineEdit>
#include <QDebug>
#include <QMetaObject>
#include <QProgressBar>
#include <QTimer>class MyTextBrowser:public QTextBrowser
{
public:MyTextBrowser(QWidget *parent = nullptr):QTextBrowser(parent){}// QWidget interface
protected:virtual void mouseDoubleClickEvent(QMouseEvent *event) override{if(event->button() == Qt::LeftButton){this->clear();}}
};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr): QWidget(parent){QVBoxLayout *root = new QVBoxLayout(this);QHBoxLayout *iplayout = new QHBoxLayout;QPushButton *button_connect = new QPushButton("connect",this);button_connect->setObjectName("connect");QLabel *ip_label = new QLabel("ip",this);QLabel *port_label = new QLabel("port",this);iplayout->addWidget(ip_label);iplayout->addWidget(ip_LineEdit);iplayout->addWidget(port_label);iplayout->addWidget(port_LineEdit);iplayout->addWidget(button_connect);iplayout->addStretch();root->addLayout(iplayout);root->addWidget(console,1);//设置默认的测试网络参数ip_LineEdit->setText("127.0.0.1");port_LineEdit->setText("6600");client->setObjectName("client");QMetaObject::connectSlotsByName(this);}~Widget(){}
public slots:void auto_connect(){if(client->state() == QAbstractSocket::ConnectedState){client->disconnectFromHost();client->waitForDisconnected();}//client->waitForConnected();std::shared_ptr<QProgressDialog> dialog(new QProgressDialog(this));dialog->setLabelText("");QProgressBar *bar = new QProgressBar(dialog.get());bar->setTextVisible(false);dialog->setBar(bar);dialog->setLabelText("connecting ... ");dialog->setRange(0,0);dialog->setCancelButton(nullptr);dialog->setWindowFlag(Qt::FramelessWindowHint);QMetaObject::Connection conn_accept= connect(client,&QTcpSocket::connected,dialog.get(),&QProgressDialog::accept);QMetaObject::Connection conn_rejected= connect(client,&QTcpSocket::stateChanged,dialog.get(),[this,dialog](){if(this->client->state() ==QAbstractSocket::UnconnectedState){dialog->reject();}});bool rtn = false;if(conn_accept&&conn_accept){QHostAddress ip(ip_LineEdit->text());int port = port_LineEdit->text().toInt();show_msg(QString("connect %1:%2 ...").arg(ip.toString()).arg(port));client->connectToHost(ip,port);rtn = dialog->exec();qDebug() << "rtn = " << rtn;if(rtn == true){show_msg(QString("connect %1:%2 success").arg(ip.toString()).arg(port));}else{show_msg(QString("connect %1:%2 fail").arg(ip.toString()).arg(port));}}else{qDebug() << "error";}if(conn_accept){QObject::disconnect(conn_accept);}if(conn_rejected){QObject::disconnect(conn_rejected);}if(!rtn){QTimer::singleShot(10, this, &Widget::auto_connect);}}void on_connect_clicked(){qDebug() << "clicked";auto_connect();}void on_client_connected(){QTcpSocket *c = (QTcpSocket *)sender();qDebug() << c->peerAddress() << "-" << c->peerName() << "-" << c->peerPort();show_msg(QString("connect %1:%2 ok").arg(c->peerAddress().toString()).arg(c->peerPort()));}void on_client_disconnected(){qDebug() << __func__<<__LINE__;show_msg(QString("disconnected"));QTimer::singleShot(10, this, &Widget::auto_connect);}void on_client_errorOccurred(QAbstractSocket::SocketError socketError){qDebug() << __func__<<__LINE__ << "socketError:" << socketError;}void on_client_hostFound(){qDebug() << __func__<<__LINE__;}// void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)void on_client_stateChanged(QAbstractSocket::SocketState socketState){qDebug() << __func__<<__LINE__<< "socketState:"<<socketState;}void show_msg(QString msg){console->append(msg);}void on_client_aboutToClose(){qDebug() << __func__<<__LINE__;}// void bytesWritten(qint64 bytes)// void channelBytesWritten(int channel, qint64 bytes)void on_client_channelReadyRead(int channel){qDebug() << __func__<<__LINE__<< "channel:"<<channel;}void on_client_readChannelFinished(){qDebug() << __func__<<__LINE__;}void on_client_readyRead(){qDebug() << __func__<<__LINE__;}public:QTcpSocket *client = new QTcpSocket(this);MyTextBrowser *console = new MyTextBrowser;QLineEdit *ip_LineEdit = new QLineEdit;QLineEdit *port_LineEdit = new QLineEdit;private:
};
#endif // WIDGET_H

版本 2:有取消按钮

 测试效果:

点击canel按钮后,就不会自动重连了:

 

测试代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.19)
project(AutoConnect LANGUAGES CXX)find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets Network)qt_standard_project_setup()qt_add_executable(AutoConnectWIN32 MACOSX_BUNDLEmain.cppwidget.hwidget.ui
)target_link_libraries(AutoConnectPRIVATEQt::CoreQt::WidgetsQt6::Network
)include(GNUInstallDirs)install(TARGETS AutoConnectBUNDLE  DESTINATION .RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)qt_generate_deploy_app_script(TARGET AutoConnectOUTPUT_SCRIPT deploy_scriptNO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})

main.cpp 

#include "widget.h"#include <QApplication>
int MyPushButton::count = 0;
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QApplication>
#include <QWidget>
#include <QTcpSocket>
#include <QProgressDialog>
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QTextBrowser>
#include <QMouseEvent>
#include <QLineEdit>
#include <QDebug>
#include <QMetaObject>
#include <QProgressBar>
#include <QTimer>class MyTextBrowser:public QTextBrowser
{
public:MyTextBrowser(QWidget *parent = nullptr):QTextBrowser(parent){}// QWidget interface
protected:virtual void mouseDoubleClickEvent(QMouseEvent *event) override{if(event->button() == Qt::LeftButton){this->clear();}}
};
class MyPushButton:public QPushButton{Q_OBJECT
public:MyPushButton(QWidget *parent = nullptr):MyPushButton("",parent){}MyPushButton(const QString &text, QWidget *parent = nullptr):QPushButton(text,parent){MyPushButton::count++;qDebug() << __func__ << __LINE__ << " create MyPushButton:count = "  << count;}~MyPushButton(){MyPushButton::count--;qDebug() << __func__ << __LINE__ << " delete MyPushButton:count = " << count;}
public:static int count;
signals:void user_click();// QWidget interface
protected:virtual void mousePressEvent(QMouseEvent *event) override{if(event->button() == Qt::LeftButton){qDebug() << __func__ << __LINE__ << "user click";emit user_click();}}
};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr): QWidget(parent){QVBoxLayout *root = new QVBoxLayout(this);QHBoxLayout *iplayout = new QHBoxLayout;QPushButton *button_connect = new QPushButton("connect",this);button_connect->setObjectName("connect");QLabel *ip_label = new QLabel("ip",this);QLabel *port_label = new QLabel("port",this);iplayout->addWidget(ip_label);iplayout->addWidget(ip_LineEdit);iplayout->addWidget(port_label);iplayout->addWidget(port_LineEdit);//iplayout->addWidget(button_connect);button_connect->setVisible(false);iplayout->addStretch();root->addLayout(iplayout);root->addWidget(console,1);//设置默认的测试网络参数ip_LineEdit->setText("127.0.0.1");port_LineEdit->setText("6600");client->setObjectName("client");QMetaObject::connectSlotsByName(this);QTimer::singleShot(10, this, &Widget::auto_connect);// std::shared_ptr<QProgressDialog> dialog(new QProgressDialog(this));// dialog->setCancelButton(new MyPushButton("hello",this));// qDebug() << "wait ...";// dialog.reset();// qDebug() << "byebye ...";}~Widget(){}
public slots:void auto_connect(){if(client->state() == QAbstractSocket::ConnectedState){client->disconnectFromHost();client->waitForDisconnected();}//client->waitForConnected();std::shared_ptr<QProgressDialog> dialog(new QProgressDialog(this));dialog->setLabelText("");QProgressBar *bar = new QProgressBar(dialog.get());bar->setTextVisible(false);dialog->setBar(bar);dialog->setLabelText("connecting ... ");dialog->setRange(0,0);MyPushButton *cancel_button = new MyPushButton("cancel",dialog.get());dialog->setCancelButton(cancel_button);dialog->setWindowFlag(Qt::FramelessWindowHint);QMetaObject::Connection conn_accept= connect(client,&QTcpSocket::connected,dialog.get(),&QProgressDialog::accept);QMetaObject::Connection conn_rejected= connect(client,&QTcpSocket::stateChanged,dialog.get(),[this,dialog](){if(this->client->state() ==QAbstractSocket::UnconnectedState){qDebug() << "connect error";dialog->reject();}});QMetaObject::Connection conn_cancel= connect(cancel_button,&MyPushButton::user_click,dialog.get(),[this,dialog](){qDebug() << "connect error";dialog->reject();this->m_user_cancel = true;show_msg("user cancel reconnect");});bool rtn = false;if(conn_accept&&conn_accept&&conn_cancel){QHostAddress ip(ip_LineEdit->text());int port = port_LineEdit->text().toInt();show_msg(QString("connect %1:%2 ...").arg(ip.toString()).arg(port));client->connectToHost(ip,port);rtn = dialog->exec();qDebug() << "rtn = " << rtn;if(rtn == true){show_msg(QString("connect %1:%2 success").arg(ip.toString()).arg(port));}else{show_msg(QString("connect %1:%2 fail").arg(ip.toString()).arg(port));}}else{qDebug() << "error";}if(conn_accept){QObject::disconnect(conn_accept);}if(conn_rejected){QObject::disconnect(conn_rejected);}if(conn_rejected){QObject::disconnect(conn_rejected);}if(conn_cancel){QObject::disconnect(conn_cancel);}if(!rtn){if(this->m_user_cancel == false){QTimer::singleShot(10, this, &Widget::auto_connect);}}}void on_connect_clicked(){qDebug() << "clicked";auto_connect();}void on_client_connected(){QTcpSocket *c = (QTcpSocket *)sender();qDebug() << c->peerAddress() << "-" << c->peerName() << "-" << c->peerPort();show_msg(QString("connect %1:%2 ok").arg(c->peerAddress().toString()).arg(c->peerPort()));}void on_client_disconnected(){qDebug() << __func__<<__LINE__;show_msg(QString("disconnected"));QTimer::singleShot(10, this, &Widget::auto_connect);}void on_client_errorOccurred(QAbstractSocket::SocketError socketError){qDebug() << __func__<<__LINE__ << "socketError:" << socketError;}void on_client_hostFound(){qDebug() << __func__<<__LINE__;}// void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)void on_client_stateChanged(QAbstractSocket::SocketState socketState){qDebug() << __func__<<__LINE__<< "socketState:"<<socketState;}void show_msg(QString msg){console->append(msg);}void on_client_aboutToClose(){qDebug() << __func__<<__LINE__;}// void bytesWritten(qint64 bytes)// void channelBytesWritten(int channel, qint64 bytes)void on_client_channelReadyRead(int channel){qDebug() << __func__<<__LINE__<< "channel:"<<channel;}void on_client_readChannelFinished(){qDebug() << __func__<<__LINE__;}void on_client_readyRead(){qDebug() << __func__<<__LINE__;}public:bool m_user_cancel = false;QTcpSocket *client = new QTcpSocket(this);MyTextBrowser *console = new MyTextBrowser;QLineEdit *ip_LineEdit = new QLineEdit;QLineEdit *port_LineEdit = new QLineEdit;private:
};
#endif // WIDGET_H

小结

相关文章:

QT:一个TCP客户端自动连接的测试模型

版本 1:没有取消按钮 测试效果&#xff1a; 缺陷&#xff1a; 无法手动停止 测试代码 CMakeLists.txt cmake_minimum_required(VERSION 3.19) project(AutoConnect LANGUAGES CXX)find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets Network)qt_standard_project_setup(…...

关于启动vue项目,出现:Error [ERR_MODULE_NOT_FOUND]: Cannot find module ‘xxx‘此类错误

目录 一、问题报错 二、原因分析 三、解决方法 一、问题报错 node环境变量配置有问题&#xff1a; (base) xxxM73H-15:~/VueProject/pproject-vue$ npm run dev /usr/bin/env: “node”: 没有那个文件或目录vue项目启动有问题&#xff1a; (base) xxx:~/VueProject/pproj…...

电路元件与电路基本定理

电流、电压和电功率 电流 1 定义&#xff1a; 带电质点的有序运动形成电流 。 单位时间内通过导体横截面的电量定义为电流强度&#xff0c; 简称电流&#xff0c;用符号 i 表示&#xff0c;其数学表达式为&#xff1a;&#xff08;i单位&#xff1a;安培&#xff08;A&#x…...

指针之矢:C 语言内存幽境的精准飞梭

一、内存和编码 指针理解的2个要点&#xff1a; 指针是内存中一个最小单元的编号&#xff0c;也就是地址平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&#xff0c;口语中说的指针通常指的是指针变量。…...

uniapp下载打开实现方案,支持安卓ios和h5,下载文件到指定目录,安卓文件管理内可查看到

uniapp下载&打开实现方案&#xff0c;支持安卓ios和h5 Android&#xff1a; 1、申请本地存储读写权限 2、创建文件夹&#xff08;文件夹不存在即创建&#xff09; 3、下载文件 ios&#xff1a; 1、下载文件 2、保存到本地&#xff0c;需要打开文件点击储存 使用方法&…...

免费干净!付费软件的平替款!

今天给大家介绍一个非常好用的电脑录屏软件&#xff0c;完全没有广告界面&#xff0c;非常的干净简洁。 电脑录屏 无广告的录屏软件 这个软件不需要安装&#xff0c;打开就能看到界面直接使用了。 软件可以全屏录制&#xff0c;也可以自定义尺寸进行录制。 录制的声音选择也非…...

软路由系统 iStoreOS 中部署 Minecraft 服务器

商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。协议(License): 知识共享署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)作者(Author): lhDream链接(URL): https://blog.luhua.site/archives/1734968846131 软路由系统 iStoreOS 中部署 Minecraft…...

第 29 章 - ES 源码篇 - 网络 IO 模型及其实现概述

前言 本文介绍了 ES 使用的网络模型&#xff0c;并介绍 transport&#xff0c;http 接收、响应请求的代码入口。 网络 IO 模型 Node 在初始化的时候&#xff0c;会创建网络模块。网络模块会加载 Netty4Plugin plugin。 而后由 Netty4Plugin 创建对应的 transports&#xff0…...

细说STM32F407单片机IIC总线基础知识

目录 一、 I2C总线结构 1、I2C总线的特点 2、I2C总线通信协议 3、 STM32F407的I2C接口 二、 I2C的HAL驱动程序 1、 I2C接口的初始化 2、阻塞式数据传输 &#xff08;1&#xff09;函数HAL_I2C_IsDeviceReady() &#xff08;2&#xff09;主设备发送和接收数据 &#…...

从头开始学MyBatis—04缓存、逆向工程、分页插件

介绍了MyBatis的缓存、逆向工程和分页插件的使用 目录 1.Mybatis的缓存 1.1MyBatis的一级缓存 1.2MyBatis的二级缓存 1.3二级缓存的相关配置 1.4MyBatis缓存查询的顺序 1.5整合第三方缓存EHCache 1.5.1添加依赖 1.5.2各jar包功能 1.5.3创建EHCache的配置文件ehcache.x…...

Artec Space Spider助力剑桥研究团队解码古代社会合作【沪敖3D】

挑战&#xff1a;考古学家需要一种安全的方法来呈现新出土的陶瓷容器&#xff0c;对比文物形状。 解决方案&#xff1a;Artec Space Spider, Artec Studio 效果&#xff1a;本项目是REVERSEACTION项目的一部分&#xff0c;旨在研究无国家社会中复杂的古代技术。研究团队在考古地…...

《探索PyTorch计算机视觉:原理、应用与实践》

《探索PyTorch计算机视觉&#xff1a;原理、应用与实践》 一、PyTorch 与计算机视觉的奇妙相遇二、核心概念解析&#xff08;一&#xff09;张量&#xff1a;计算机视觉的数据基石&#xff08;二&#xff09;神经网络&#xff1a;视觉任务的智慧大脑&#xff08;三&#xff09;…...

【C#设计模式(21)——状态模式(State Pattern)】

前言 状态模式:在对象内部发生改变时改变其行为&#xff0c;使得对象在不同的状态下具有不同的行为表现。 代码 #region 状态模式-类/// 抽象 交通灯状态public abstract class TrafficLightState{public abstract void Display();}//红灯public class RedLight : TrafficLight…...

nvm日常使用中常用命令总结

日常开发vue项目中&#xff0c;不同的项目 我们可能需要安装不同的node版本&#xff0c;但是为了方便切换node&#xff0c;我们一般会安装一个名称为nvm的工具&#xff0c;这里总结一下&#xff0c;nvm常用的命令&#xff1a; 1、为了查看可用的 Node.js 版本&#xff0c;你可…...

【数据仓库】SparkSQL数仓实践

文章目录 集成hive metastoreSQL测试spark-sql 语法SQL执行流程两种数仓架构的选择hive on spark数仓配置经验 spark-sql没有元数据管理功能&#xff0c;只有sql 到RDD的解释翻译功能&#xff0c;所以需要和hive的metastore服务集成在一起使用。 集成hive metastore 在spark安…...

PessimisticLock

想象你和你的朋友都想去图书馆借同一本非常受欢迎的小说。为了确保你们中的一位能够成功借到这本书&#xff0c;图书馆采用了悲观锁机制来管理借阅过程。 悲观锁的方式 查看书籍状态&#xff1a;当你到达图书馆并决定要借这本小说时&#xff0c;你先告诉图书管理员你想借这本…...

【Maven】属性管理

1. 属性 问题导入 定义属性有什么好处&#xff1f; 1.1 属性配置与使用 ①&#xff1a;定义属性 <!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version><junit.version>4.12</junit.version> </prop…...

微信小程序性能优化、分包

性能优化是任何应用开发中的重要组成部分&#xff0c;尤其是在移动环境中。对于微信小程序而言&#xff0c;随着用户量的增加和应用功能的丰富&#xff0c;性能优化显得尤为关键。良好的性能不仅提升用户体验&#xff0c;还能增加用户留存率和应用的使用频率。我们将探讨如何在…...

TDengine 新功能 VARBINARY 数据类型

1. 背景 VARBINARY 数据类型用于存储二进制数据&#xff0c;与 MySQL 中的 VARBINARY 数据类型功能相同&#xff0c;VARBINARY 数据类型长度可变&#xff0c;在创建表时指定最大字节长度&#xff0c;使用进按需分配存储&#xff0c;但不能超过建表时指定的最大值。 2. 功能说明…...

【Maven】工程依赖下载失败错误解决

在使用 Maven 构建项目时&#xff0c;可能会发生依赖项下载错误的情况&#xff0c;主要原因有以下几种&#xff1a; 下载依赖时出现网络故障或仓库服务器宕机等原因&#xff0c;导致无法连接至 Maven 仓库&#xff0c;从而无法下载依赖。 依赖项的版本号或配置文件中的版本号错…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...