Qt学习 网络编程 TPC通信
一 基本网络端口
1 网络编程基本概念
- 通讯方式:信息的通讯时通过网络来进行,通讯方式有两种,TCP和UDP通信,TCP通讯是专用通道,指定某个信息只能走某个通道,UDP则是非专用通道,比如一个车队,有1~3号车,从北京到成都,TCP通道则是,3个车一起走指定的一条线路,UDP通道则是,3量车可以走不同的线路,无所谓先后顺序到达北京,根据途径路线的拥堵程度,来进行路线的选择
- 什么是服务器和客户端:客户端主动发起连接,连接到服务器可以开启通讯,反过来不可以,一个服务器,服务多个客户端
2 网络端口访问案例
- 知识点1:UI界面布局如果将组件设置顶端对齐

- 在
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QHBoxLayout *layout = new QHBoxLayout(this);layout->addWidget(ui->groupBox, 0,Qt::AlignTop);layout->addWidget(ui->plainTextEdit);this->centralWidget()->setLayout(layout);
}

- 知识点2:获取指定域名的Ip地址的时候,需要定义槽函数,当前案例定义的槽函数
void lookUpHost(const QHostInfo &info );
void MainWindow::on_pushButtonGivenSpace_clicked()
{//获取填写的域名QString name = ui->lineEdit->text();if(name.length() == 0){return;}ui->textPrint->append("正在查找" + name +"的IP地址。。。");QHostInfo::lookupHost(name, this,SLOT(lookUpHost(QHostInfo)));
}
-
知识点3:使用到网络模块,需要在项目.por文件中添加
network关键字

-
代码
-
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QHostInfo>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButtonHostname_clicked();void on_pushButtonHostname_2_clicked();void on_pushButtonHostname_3_clicked();void on_pushButtonGivenSpace_clicked();void lookUpHost(const QHostInfo &info );void on_pushButtonIPS_clicked();void on_pushButtonIPSinter_clicked();void on_pushButtonClear_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHBoxLayout>
#include <QHostInfo>
#include <QNetworkInterface>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QHBoxLayout *layout = new QHBoxLayout(this);layout->addWidget(ui->groupBox, 0,Qt::AlignTop);layout->addWidget(ui->textPrint);this->centralWidget()->setLayout(layout);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButtonHostname_clicked()
{//获取本地主机名QString hostname = QHostInfo::localHostName();ui->textPrint->append("获取本地主机名 : " + hostname);
}void MainWindow::on_pushButtonHostname_2_clicked()
{QString hostname = QHostInfo::localHostName();QHostInfo iP_V4 = QHostInfo::fromName(hostname); //获取指定主机的信息QList<QHostAddress> addrlist = iP_V4.addresses();if(!addrlist.isEmpty()){for(int i =0 ;i <addrlist.count(); i++){QHostAddress address =addrlist[i];if(address.protocol() == QAbstractSocket::IPv4Protocol){ui->textPrint->append(address.toString());}}}
}void MainWindow::on_pushButtonHostname_3_clicked()
{QString hostname = QHostInfo::localHostName();QHostInfo iP_V6 = QHostInfo::fromName(hostname); //获取指定主机的信息QList<QHostAddress> addrlist = iP_V6.addresses();if(!addrlist.isEmpty()){for(int i =0 ;i <addrlist.count(); i++){QHostAddress address =addrlist[i];if(address.protocol() == QAbstractSocket::IPv6Protocol){ui->textPrint->append(address.toString());}}}
}void MainWindow::on_pushButtonGivenSpace_clicked()
{//获取填写的域名QString name = ui->lineEdit->text();if(name.length() == 0){return;}ui->textPrint->append("正在查找" + name +"的IP地址。。。");QHostInfo::lookupHost(name, this,SLOT(lookUpHost(QHostInfo)));
}void MainWindow::lookUpHost(const QHostInfo &info)
{QList<QHostAddress> addrlist = info.addresses();if(!addrlist.isEmpty()){for(int i =0 ;i <addrlist.count(); i++){QHostAddress address =addrlist[i];if(address.protocol() == QAbstractSocket::IPv4Protocol){ui->textPrint->append(address.toString());}}}
}void MainWindow::on_pushButtonIPS_clicked()
{QList<QHostAddress> addrlist = QNetworkInterface::allAddresses();if(!addrlist.isEmpty()){for(int i =0 ;i <addrlist.count(); i++){QHostAddress address =addrlist[i];if(address.protocol() == QAbstractSocket::IPv4Protocol){ui->textPrint->append(address.toString());}}}
}void MainWindow::on_pushButtonIPSinter_clicked()
{QList<QNetworkInterface> addrlist = QNetworkInterface::allInterfaces();if(!addrlist.isEmpty()){for(int i =0 ;i <addrlist.count(); i++){QNetworkInterface interface =addrlist[i];if(interface.isValid()){ui->textPrint->append("设备名称:" + interface.humanReadableName());ui->textPrint->append("硬件地址:" + interface.hardwareAddress());//一个网卡可以有多个IP地址QList<QNetworkAddressEntry> list2 = interface.addressEntries();for(int j =0 ;j <list2.count(); j++){QNetworkAddressEntry entry = list2[j];ui->textPrint->append("\tIP地址:" + entry.ip().toString());ui->textPrint->append("\t子掩码:" + entry.netmask().toString());ui->textPrint->append("\t广播地址:" + entry.broadcast().toString());}}}}
}void MainWindow::on_pushButtonClear_clicked()
{ui->textPrint->clear();
}
3 服务器和客户端访问案例

3.1 项目添加关键字

3.2 定义服务器 QTcpServer *tcpserver;,并获取当前的服务器的IP地址,使其出现在comboBox中,服务器的连接需要定义槽函数,newConnection()是QTcpServer类中的信号;信号槽的实现
//setCentralWidget(ui->plainTextEdit);//获取服务器端,可选得IP地址QHostInfo hostINFO = QHostInfo::fromName(QHostInfo::localHostName());QList<QHostAddress> addlist = hostINFO.addresses();if(!addlist.isEmpty()){for(int i = 0; i < addlist.count(); i++){QHostAddress address = addlist[i];if(address.protocol() == QAbstractSocket::IPv4Protocol){ui->comboBox->addItem(address.toString());}}}//用来做测试的ui->comboBox->addItem("127.0.0.1");tcpserver = new QTcpServer(this);connect(tcpserver,SIGNAL(newConnection()),this,SLOT(on_newConnection()));
3.3 服务器中信号槽的实现,需要定义套接字QTcpServer *tcpserver;,服务器里面对每一个客户端,都会开启一个新的套接字来完成该客户端的信号的发送和接收,所以信号的连接与否等操作,都需要定义一个相应的套接字的信号槽来进行实现
void MainWindow::on_newConnection()
{tcpSocket = tcpserver->nextPendingConnection();//当有数据可以读的是,就读数据,使用信号槽connect(tcpSocket,SIGNAL(readyRead()), this, SLOT(on_readyRead()));connect(tcpSocket,SIGNAL(connected()), this, SLOT(on_connected()));connect(tcpSocket,SIGNAL(disconnected()), this, SLOT(on_disonnected()));connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(on_stateChanged(QAbstractSocket::SocketState)));on_stateChanged(tcpSocket->state());
}
3.4 代码测试,当前所写代码,既可以当成客户端,也可以当成服务器,假设将其当成服务器,如果要测试代码,还需要写一个客户端来进行测试,但是无法保证客户端的正确性,可以借助TCP调试软件来进行调试,当前下载软件如下,在电脑本身的应用商店下载即可,安装完毕之后直接打开即可

3.4.1 先运行QT代码,选择测试端口,启动TCP调试软件,在右侧选择TCP Client,以及远程端选择127.0.0.1,Local不用管,然后点击QT代码运行,然后点击软件右侧的Connect`


3.4.2 qt端发送信号,直接在发送前的条形框里面输入信号,点击发送即可,会在调试软件右侧的大框里面显现出信号

3.4.3 调试软件向QT窗口发送信号,因为每次只发送一行信号,在右下角的框里面输入信号,无法回车,直接点发送,在QT窗口端是没有反应的,勾选Send as Hex,119会自动跳变成编码,在编码后添加0A, 然后再取消勾选,会看到鼠标换行了,此时再点击发送,会看到QT窗口端接收到的信号




代码
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QTcpServer *tcpserver;QTcpSocket *tcpSocket; //tcp套接字,服务器里面对每一个客户端,都会开启一个新的套接字来完成该客户端的信号的发送和接收QLabel *label; //状态栏的标签QLabel *labelSockt; //状态栏的标签
private slots:void on_newConnection();void on_readyRead();void on_connected();void on_disonnected();void on_stateChanged(QAbstractSocket::SocketState);void on_actionJianTing_triggered();void on_pushButton_clicked();void on_actionStop_triggered();void on_actionClear_triggered();void on_actionExit_triggered();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostInfo>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//setCentralWidget(ui->plainTextEdit);//获取服务器端,可选得IP地址QHostInfo hostINFO = QHostInfo::fromName(QHostInfo::localHostName());QList<QHostAddress> addlist = hostINFO.addresses();if(!addlist.isEmpty()){for(int i = 0; i < addlist.count(); i++){QHostAddress address = addlist[i];if(address.protocol() == QAbstractSocket::IPv4Protocol){ui->comboBox->addItem(address.toString());}}}//用来做测试的ui->comboBox->addItem("127.0.0.1");tcpserver = new QTcpServer(this);connect(tcpserver,SIGNAL(newConnection()),this,SLOT(on_newConnection()));label = new QLabel("监听状态:");label->setMinimumWidth(200);ui->statusbar->addWidget(label);labelSockt = new QLabel("套接字状态:");labelSockt->setMinimumWidth(200);ui->statusbar->addWidget(labelSockt);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_newConnection()
{tcpSocket = tcpserver->nextPendingConnection();//当有数据可以读的是,就读数据,使用信号槽connect(tcpSocket,SIGNAL(readyRead()), this, SLOT(on_readyRead()));connect(tcpSocket,SIGNAL(connected()), this, SLOT(on_connected()));connect(tcpSocket,SIGNAL(disconnected()), this, SLOT(on_disonnected()));connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(on_stateChanged(QAbstractSocket::SocketState)));on_stateChanged(tcpSocket->state());
}void MainWindow::on_readyRead()
{while(tcpSocket->canReadLine()){ui->plainTextEdit->appendPlainText("on_readyRead [收到] " + tcpSocket->readLine());}
}void MainWindow::on_connected()
{ui->plainTextEdit->appendPlainText("\n on_connected:客户端已经接入");//客户端地址信息ui->plainTextEdit->appendPlainText("客户端地址: " +tcpSocket->peerAddress().toString());ui->plainTextEdit->appendPlainText("客户端口号:" +QString::number(tcpSocket->peerPort()));
}void MainWindow::on_disonnected()
{ui->plainTextEdit->appendPlainText("\n客户端已经断开连接");tcpSocket->deleteLater();
}void MainWindow::on_stateChanged(QAbstractSocket::SocketState status)
{switch(status){case QAbstractSocket::UnconnectedState:labelSockt->setText("套接字状态:未连接");break;case QAbstractSocket::HostLookupState:labelSockt->setText("套接字状态:HostLookupState");break;case QAbstractSocket::ConnectingState:labelSockt->setText("套接字状态:ConnectingState");break;case QAbstractSocket::ConnectedState:labelSockt->setText("套接字状态:ConnectedState");break;case QAbstractSocket::BoundState:labelSockt->setText("套接字状态:BoundState");break;case QAbstractSocket::ListeningState:labelSockt->setText("套接字状态:ListeningState");break;case QAbstractSocket::ClosingState:labelSockt->setText("套接字状态:ClosingState");break;default:break;}}void MainWindow::on_actionJianTing_triggered()
{QString ip = ui->comboBox->currentText();quint16 port = ui->spinBox->value();QHostAddress addr(ip);tcpserver->listen(addr,port);ui->plainTextEdit->appendPlainText("on_actionJianTing_triggered 开始监听,等待客户端发起连接...");ui->plainTextEdit->appendPlainText("服务器地址:" +tcpserver->serverAddress().toString());ui->plainTextEdit->appendPlainText("服务器端口:" +QString::number(tcpserver->serverPort()));ui->actionStop->setEnabled(true);ui->actionJianTing->setEnabled(false);label->setText("监听状态:正在监听");
}void MainWindow::on_pushButton_clicked()
{//发送一行字符串QString msg = ui->lineEdit->text();QByteArray str = msg.toUtf8();str.append("\n");//发送数据tcpSocket->write(str);
}void MainWindow::on_actionStop_triggered()
{if(tcpserver->isListening()){tcpserver->close();ui->actionJianTing->setEnabled(true);ui->actionStop->setEnabled(false);label->setText("监听状态:停止监听");}}void MainWindow::on_actionClear_triggered()
{ui->plainTextEdit->clear();
}void MainWindow::on_actionExit_triggered()
{this->close();
}
4 代码实现客户端和服务器,并相互发送信号进行测试

- 服务器代码就是案例3中的代码,注意,运行的时候,要同时打开两个QT界面
- 客户端代码如下,过程基本上同案例3
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTcpSocket>
#include <QLabel>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QTcpSocket *tcpScoket;QLabel *labelSocket;
private slots:void on_readyRead();void on_connected();void on_disonnected();void on_stateChanged(QAbstractSocket::SocketState);void on_actionConnect_triggered();void on_actionDisconnect_triggered();void on_actionClear_triggered();void on_actionExit_triggered();void on_pushButton_clicked();protected:void closeEvent(QCloseEvent *event); //父类的虚函数,用于关闭窗口
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostAddress>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建客户端的套接字对象tcpScoket = new QTcpSocket(this);connect(tcpScoket,SIGNAL(connected()), this, SLOT(on_connected()));connect(tcpScoket,SIGNAL(disconnected()), this, SLOT(on_disonnected()));connect(tcpScoket,SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(on_stateChanged(QAbstractSocket::SocketState)));connect(tcpScoket,SIGNAL(readyRead()), this, SLOT(on_readyRead()));labelSocket = new QLabel("套接字状态:");ui->statusbar->addWidget(labelSocket);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_connected()
{ui->plainTextEdit->appendPlainText("已连接到服务器");ui->plainTextEdit->appendPlainText("服务器地址:" +tcpScoket->peerAddress().toString());ui->plainTextEdit->appendPlainText("服务器端口:" +QString::number(tcpScoket->peerPort()));ui->actionConnect->setEnabled(false);ui->actionDisconnect->setEnabled(true);}void MainWindow::on_disonnected()
{ui->plainTextEdit->appendPlainText("服务器断开");ui->actionConnect->setEnabled(true);ui->actionDisconnect->setEnabled(false);
}void MainWindow::on_stateChanged(QAbstractSocket::SocketState status)
{switch(status){case QAbstractSocket::UnconnectedState:labelSocket->setText("套接字状态:未连接");break;case QAbstractSocket::HostLookupState:labelSocket->setText("套接字状态:HostLookupState");break;case QAbstractSocket::ConnectingState:labelSocket->setText("套接字状态:ConnectingState");break;case QAbstractSocket::ConnectedState:labelSocket->setText("套接字状态:ConnectedState");break;case QAbstractSocket::BoundState:labelSocket->setText("套接字状态:BoundState");break;case QAbstractSocket::ListeningState:labelSocket->setText("套接字状态:ListeningState");break;case QAbstractSocket::ClosingState:labelSocket->setText("套接字状态:ClosingState");break;default:break;}
}void MainWindow::on_readyRead()
{while(tcpScoket->canReadLine()){ui->plainTextEdit->appendPlainText("收到 : " + tcpScoket->readLine());}
}
void MainWindow::on_actionConnect_triggered()
{QString ip = ui->lineEditAdress->text();quint16 port = ui->spinBox->value();tcpScoket->connectToHost(ip,port);
}void MainWindow::on_actionDisconnect_triggered()
{if(tcpScoket->state() == QAbstractSocket::ConnectedState){tcpScoket->disconnectFromHost();}
}void MainWindow::on_actionClear_triggered()
{ui->plainTextEdit->clear();
}void MainWindow::on_actionExit_triggered()
{this->close();
}void MainWindow::closeEvent(QCloseEvent *event)
{if(tcpScoket->state() == QAbstractSocket::ConnectedState){tcpScoket->disconnectFromHost();}event->accept();
}void MainWindow::on_pushButton_clicked()
{QString MSG = ui->lineEditDiliver->text();QByteArray str = MSG.toUtf8();str.append("\n");tcpScoket->write(str);ui->plainTextEdit->appendPlainText("发送:" + MSG);ui->lineEditDiliver->clear();ui->lineEditDiliver->setFocus();
}相关文章:
Qt学习 网络编程 TPC通信
一 基本网络端口 1 网络编程基本概念 通讯方式:信息的通讯时通过网络来进行,通讯方式有两种,TCP和UDP通信,TCP通讯是专用通道,指定某个信息只能走某个通道,UDP则是非专用通道,比如一个车队&am…...
ESP32-S3 实战指南:BOOT-KEY 按键驱动开发全解析
一、基础知识 本篇我们使用 BOOT 按键来学习一下 GPIO 功能,首先补充一下相关术语介绍。 1、GPIO(General Purpose Input/Output) GPIO 是微控制器上的通用引脚,既可以作为输入(读取外部信号)࿰…...
ssh配置 远程控制 远程协作 github本地配置
0.设备版本 windows11 ubuntu24.0.4 1.1 在 Linux 上启用 SSH 服务 首先,确保 Linux 计算机上安装并启用了 SSH 服务。 安装和启动 OpenSSH 服务(如果未安装) # 在终端安装 OpenSSH 服务(如果尚未安装) sudo apt …...
C++知识整理day9——继承(基类与派生类之间的转换、派生类的默认成员函数、多继承问题)
文章目录 1.继承的概念和定义2.基类与派生类之间的转换3.继承中的作用域4.派生类的默认成员函数5.实现一个不能被继承的类6.继承与友元7.继承与静态成员8.多继承和菱形继承问题8.1 继承分类及菱形继承8.2 虚继承 1.继承的概念和定义 概念: 继承(inheritance)机制是⾯…...
2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序
2024年国赛高教杯数学建模 A题 板凳龙闹元宵 原题再现 “板凳龙”,又称“盘龙”,是浙闽地区的传统地方民俗文化活动。人们将少则几十条,多则上百条的板凳首尾相连,形成蜿蜒曲折的板凳龙。盘龙时,龙头在前领头&#x…...
华为认证考试证书下载步骤(纸质+电子版)
华为考试证书可以通过官方渠道下载相应的电子证书,部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下: ①访问华为培训与认证网站 打开浏览器,登录华为培训与认证官方网站 ②登录个人账号 在网站首页,点…...
[杂学笔记]工厂模式、多态、内存空间区域划分、cp指令破坏软连接问题、UDP如何实现可靠传输、滑动窗口的原理、进程与线程、线程之间的通信
目录 1.工厂模式 2.多态 3.内存空间区域划分 4.cp指令破坏软连接问题 5.UDP实现可靠传输 6.滑动窗口的原理 7.进程与线程 8.线程之间的通信 1.工厂模式 工厂模式是一种创建对象的设计模式。它提供了一种创建对象的方式,将对象的创建和使用分离,通…...
开源RAG主流框架有哪些?如何选型?
开源RAG主流框架有哪些?如何选型? 一、开源RAG框架全景图 (一)核心框架类型对比 类型典型工具技术特征适用场景传统RAGLangChain, Haystack线性流程(检索→生成)通用问答、知识库检索增强型RAGRAGFlow, AutoRAG支持重排序、多路召回优化高精度问答、复杂文档处理轻量级…...
【Android】用 chrome://inspect/#devices 调试H5页面
通常做Android开发的过程中,不可避免的需要遇到去与H5交互,甚至有时候需要去调试H5的信息。 这里分享一下Android工程里如何调试H5页面信息: 直接在浏览器地址栏输入 : chrome://inspect/#devices 直接连接手机usb,打开开发者模式…...
贪心算法精品题
1.找钱问题 本题的贪心策略在于我们希望就可能的保留作用大的5元 class Solution { public:bool lemonadeChange(vector<int>& bills) {std::map<int ,int> _map;for(auto ch:bills){if(ch 5) _map[ch];else if(ch 10){if(_map[5] 0) return false;else{_m…...
七、Spring Boot:初识与项目搭建
深入解析 Spring Boot:初识与项目搭建 Spring Boot 是基于 Spring Framework 的开源 Java 基础框架,旨在简化 Spring 应用的开发过程。它通过“约定优于配置”的理念,极大地减少了开发中的配置工作,同时提供了“开箱即用”的功能…...
WEB1~6通杀
##解题思路 这六道题,通杀了,只因为是PHP的特性 来,看web6,过滤最复杂的正则,而且不能解析成大于999的值,但是,php是弱类型的语言,我只要输入任意字符数字,最终值就为0&…...
孜然单授权系统V2.0PHP授权系统
孜然单授权V1.0系统,延续了2022年开发的孜然多应用授权系统V2.0 变更:多应用变单系统,去除没用的垃圾代码,从0开发,去除了一些没用的功能 完善了开发文档,之前那套是我写着玩的屎山代码,V1.0将展…...
Apache SeaTunnel 构建实时数据同步管道(最新版)
文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member,Apache SkyWalking Committer,多年平台研发经验,目前专注于数据集成领域。 导读 在当今数字化快速发展的时代,数据已然成为企业决策…...
数据保护API(DPAPI)深度剖析与安全实践
Windows DPAPI 安全机制解析 在当今数据泄露与网络攻击日益频繁的背景下,Windows 提供的 DPAPI(Data Protection API)成为开发者保护本地敏感数据的重要工具。本文将从 双层密钥体系、加密流程、跨上下文加密、已知攻击向量与防御措施、企业…...
服务器离线部署DeepSeek
目标 本次部署的目标是在本地服务器上部署DeepSeek。但是该服务不能连接外网,因此只能使用离线部署的方式。为了一次完成部署。现在云服务器上进行尝试。 云服务器部署尝试 云服务器配置 CentOS72080Ti 11GB 安装准备 1、上传iso并配置为本地yum源 安装前先将…...
ComfyUI:Stable Diffusion 及 LoRA、VAE 、ControlNet模型解析
目录 Stable Diffusion流程 扩散过程 去噪过程 checkpoints LoRA LoRA 位置与结构 LoRA 层与原层的关系 LoRA 层的参数拆解 VAE 训练特定 VAE 时更新的参数部分 ControlNet ControlNet 位置与结构 ControlNet 的训练过程 ControlNet 的参数处理与信息融合 Contr…...
微信小程序:多菜单栏设计效果
一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…...
【Linux Oracle】time命令+oracle exp压缩
Linux && Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.说明 Linux中的time命令:主要用于测量命令的执行时间,并显示该命令在执行过程中所使用的系统资源情况,如CPU时间、内存和…...
20分钟 Bash 上手指南
文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号(过滤条件)重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash࿰…...
v4l2子系统学习(三)编写虚拟摄像头驱动
文章目录 1、声明2、前言3、虚拟摄像头驱动编写3.1、编写硬件相关代码3.2、程序示例 1、声明 本文是在学习韦东山《驱动大全》V4L2子系统时,为梳理知识点和自己回看而记录,全部内容高度复制粘贴。 韦老师的《驱动大全》:商品详情 其对应的…...
【前端定位线上问题的多种方案(不依赖 Sentry)】
前端定位线上问题的多种方案(不依赖 Sentry) 🛠️ 一、构建时注入调试信息 🔧 1. 注入版本信息与 Git 提交哈希 Webpack 配置: // webpack.config.js const webpack require(webpack); const gitRevision require(…...
【虚拟仪器技术】labview操作指南和虚拟仪器技术习题答案(一)
今天是2025年2月24日,画的是fate/Grand Order里面的阿尔托莉雅.卡斯特,武内老师的画。 目录 第1章 第2章 第3章 第4章 第5章 关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程…...
LabVIEW电能质量分析软件
随着电力系统的复杂性增加,电能质量问题日益突出,传统的电能质量检测装置多采用DSP技术,不仅开发周期长、功能单一,而且在多功能集成方面存在局限性。基于LabVIEW虚拟仪器开发平台的电能质量分析软件利用FFT、STFT、WT、HHT等多种…...
视频裂变加群推广分享引流源码
源码介绍 视频裂变加群推广分享引流源码 最近网上很火,很多人都在用,适合引流裂变推广 测试环境:PHP7.4(PHP版本不限制) 第一次访问送五次观看次数,用户达到观看次数后需要分享给好友或者群,好友必须点击推广链接后才会增加观看次…...
《深度剖析:AI与姿态估计技术在元宇宙VR交互中的应用困境》
在元宇宙的宏大版图里,虚拟现实(VR)交互是构建沉浸式体验的关键支柱,而人工智能(AI)与姿态估计技术的融合,本应成为提升交互体验的强大引擎。但在实际应用中,它们面临着诸多复杂且棘…...
项目一 - 任务3:搭建Java集成开发环境IntelliJ IDEA
通过本次实战,我们成功搭建了Java集成开发环境IntelliJ IDEA,并完成了多个任务。首先,安装了IntelliJ IDEA并进行了个性化设置,如选择主题、调整字体和编码等。接着,创建了Java项目、包和类,编写并运行了简…...
RoCBert:具有多模态对比预训练的健壮中文BERT
摘要 大规模预训练语言模型在自然语言处理(NLP)任务上取得了最新的最优结果(SOTA)。然而,这些模型容易受到对抗攻击的影响,尤其是对于表意文字语言(如中文)。 在本研究中࿰…...
Dockerfile 中的 COPY 语句:作用与使用详解
在 Docker 的构建过程中,Dockerfile 是一个核心文件,它定义了镜像的构建步骤和内容。其中,COPY 语句是一个非常重要的指令,用于将文件或目录从构建上下文(通常是 Dockerfile 所在的目录及其子目录)复制到容…...
DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库
项目地址:https://github.com/deepseek-ai/DeepEP 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天 (2/5)! 引言 在大模型训练中,混合专家模型(Mixture-of-Experts, MoE)因其动…...
