QT基础篇(10)QT5网络与通信
QT5网络与通信是指在QT5开发环境中使用网络进行数据传输和通信的相关功能和技术。
QT5提供了一套完善的网络模块,包括了TCP、UDP、HTTP等协议的支持,可以方便地在QT应用程序中进行网络通信。通过QT5的网络模块,开发者可以实现客户端和服务器之间的数据传输、消息推送、远程控制等功能。
在QT5中,可以使用QTcpSocket类和QUdpSocket类来实现TCP和UDP协议的数据传输。QTcpSocket类提供了基于TCP协议的套接字接口,可以实现可靠的数据传输和连接管理;QUdpSocket类则提供了基于UDP协议的套接字接口,可以实现快速的数据传输和广播。
除了基本的TCP和UDP通信,QT5还提供了QNetworkAccessManager类和QNetworkRequest类来实现HTTP通信。QNetworkAccessManager类是QT5中的HTTP客户端类,可以实现HTTP请求和响应的处理;QNetworkRequest类用于表示HTTP请求的相关信息,如URL地址、请求头等。
此外,QT5还提供了一些其他的网络相关类和功能,如QTcpServer类用于实现TCP服务器端的功能、QSslSocket类用于实现安全的网络通信、QWebSocket类用于实现WebSocket协议的通信等。
总之,QT5网络与通信提供了一套简单易用、功能丰富的网络编程接口,使得开发者可以方便地在QT应用程序中实现各种网络通信功能。
1.获取本机网络信息
在QT5中,可以使用QNetworkInterface类来获取本机的网络信息。QNetworkInterface类提供了一组静态函数用于查询本机的网络接口信息,如IP地址、MAC地址等。
以下是一个示例代码,展示如何使用QNetworkInterface类获取本机网络信息:
#include <QtNetwork>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 获取本机的网络接口列表QList<QNetworkInterface> interfaceList = QNetworkInterface::allInterfaces();// 遍历网络接口列表foreach (QNetworkInterface interface, interfaceList) {// 输出网络接口的名称和硬件地址(MAC地址)qDebug() << "Interface name:" << interface.name();qDebug() << "Hardware address (MAC):" << interface.hardwareAddress();// 获取接口的IP地址列表QList<QNetworkAddressEntry> addressList = interface.addressEntries();foreach (QNetworkAddressEntry entry, addressList) {// 输出IP地址和子网掩码qDebug() << "IP address:" << entry.ip().toString();qDebug() << "Netmask:" << entry.netmask().toString();}qDebug() << "------------------------------------";}return a.exec();
}
上述代码使用QNetworkInterface::allInterfaces()函数获取本机的所有网络接口列表,然后通过遍历列表,获取每个网络接口的名称、硬件地址(MAC地址)、IP地址等信息,并进行输出展示。
注意,要使用QT的网络模块,需要在.pro文件中添加QT += network
声明,以添加网络模块的依赖。
运行上述代码,即可获取到本机的网络信息,并进行输出展示。
2.基于UDP的网络广播程序
2.1 UDP工作原理
UDP(User Datagram Protocol)是一种无连接的传输层协议,它在网络通信中提供了一种简单的、不可靠的数据传输方式。与TCP相比,UDP不提供可靠的传输和重发机制,也没有流量控制和拥塞控制。UDP主要用于那些对实时性要求较高,对数据丢失不敏感的应用场景,如音视频传输、在线游戏等。
UDP的工作原理如下:
-
建立UDP套接字:在数据传输之前,发送方和接收方需要分别创建UDP套接字(socket)。套接字是网络通信的端点,用于发送和接收数据。
-
发送数据报文:发送方将待发送的数据封装成一个数据报,并通过UDP套接字发送出去。数据报由目标IP地址和端口号标识。
-
数据报文传输:UDP将数据报直接传输给目标主机,不进行可靠性保证和流量控制。数据报可能会被网络中的路由器丢失、延迟或重排序。
-
数据报文接收:接收方的UDP套接字接收到数据报后,将其解析为原始数据,并提供给应用程序使用。
UDP的特点和适用场景:
- 无连接:UDP在通信前不需要进行握手和建立连接,因此可以更快地发送数据。
- 不可靠:数据报可能会丢失、重复、乱序传输,因为UDP不提供重发和确认机制。
- 尽力而为:UDP尽最大努力交付数据,但不能保证数据的可靠性和按序性。
- 适用于实时性要求高、数据丢失不敏感的应用场景,如音视频传输、实时游戏等。
总结:UDP是一种简单、高效的传输协议,适用于实时性要求较高、对数据丢失不敏感的应用场景。它不提供可靠性保证和流量控制,但传输速度快,延迟低。
2.2 UDP编程模型
UDP编程模型是一种用于在应用程序中实现UDP通信的方式。UDP编程模型主要包括以下几个步骤:
-
创建UDP套接字:在应用程序中创建一个UDP套接字,套接字是进行网络通信的端点,用于发送和接收数据。
-
绑定套接字:将套接字绑定到一个特定的本地IP地址和端口号上。这样,套接字就可以接收来自该IP地址和端口号的数据。
-
发送数据:通过UDP套接字发送数据报文。发送时,需要指定目标IP地址和端口号。
-
接收数据:通过UDP套接字接收数据报文。可以使用非阻塞模式或阻塞模式进行接收。
-
处理接收的数据:应用程序处理接收到的数据报文,解析其中的数据并进行相关的处理。
-
关闭套接字:完成UDP通信后,应用程序需要关闭套接字释放资源。
在实际的UDP编程中,可以使用不同的编程语言和框架来实现UDP通信。例如,使用C语言可以使用socket API来创建和管理UDP套接字,使用Python可以使用socket模块来进行UDP编程,使用Qt框架可以使用QUdpSocket类来实现UDP通信等。
总结:UDP编程模型包括创建UDP套接字、绑定套接字、发送和接收数据以及处理数据的过程。通过使用不同的编程语言和框架,可以实现UDP通信并进行相应的数据处理。
2.3 UDP服务器编程
在QT5中,可以使用QUdpSocket类来实现UDP服务器端的编程。以下是一个基本的QT5 UDP服务器端编程的示例:
#include <QtNetwork>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建一个QUdpSocket对象QUdpSocket udpSocket;// 绑定服务器的IP地址和端口号udpSocket.bind(QHostAddress::AnyIPv4, 1234);// 当有数据到达时触发readyRead()函数QObject::connect(&udpSocket, &QUdpSocket::readyRead, [&](){while (udpSocket.hasPendingDatagrams()) {// 读取接收到的数据报文QByteArray datagram;datagram.resize(udpSocket.pendingDatagramSize());udpSocket.readDatagram(datagram.data(), datagram.size());// 处理接收到的数据,这里简单打印出数据内容qDebug() << "Received data: " << datagram;}});return a.exec();
}
在上面的代码中,首先创建一个QUdpSocket对象udpSocket,然后使用bind()函数将其绑定到服务器端的IP地址和端口号上(这里使用了任意IPv4地址和端口号1234)。接下来,使用QObject的connect()函数将udpSocket的readyRead信号连接到一个lambda函数,该函数会在有数据到达时被触发。在lambda函数中,通过udpSocket的pendingDatagramSize()函数获取待处理数据报文的大小,并使用readDatagram()函数读取数据报文的内容。最后,可以根据业务需求进行对接收数据的处理。
请注意,以上示例仅为演示UDP服务器端的基本逻辑,实际的服务器端编程可能还需要处理各种异常情况,进行错误处理,以及向客户端发送响应等。
2.4 UDP客户端编程
在QT5中,可以使用QUdpSocket类来实现UDP客户端的编程。以下是一个基本的QT5 UDP客户端编程的示例:
#include <QtNetwork>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建一个QUdpSocket对象QUdpSocket udpSocket;// 发送数据报文到服务器端QByteArray datagram = "Hello, server!";udpSocket.writeDatagram(datagram, QHostAddress("127.0.0.1"), 1234);// 当有数据到达时触发readyRead()函数QObject::connect(&udpSocket, &QUdpSocket::readyRead, [&](){while (udpSocket.hasPendingDatagrams()) {// 读取接收到的数据报文QByteArray datagram;datagram.resize(udpSocket.pendingDatagramSize());udpSocket.readDatagram(datagram.data(), datagram.size());// 处理接收到的数据,这里简单打印出数据内容qDebug() << "Received data: " << datagram;}});return a.exec();
}
在上面的代码中,首先创建一个QUdpSocket对象udpSocket。然后,使用writeDatagram()函数向服务器端发送数据报文,其中datagram是要发送的数据,QHostAddress("127.0.0.1")是服务器的IP地址,1234是服务器的端口号。接下来,使用QObject的connect()函数将udpSocket的readyRead信号连接到一个lambda函数,该函数会在有数据到达时被触发。在lambda函数中,通过udpSocket的pendingDatagramSize()函数获取待处理数据报文的大小,并使用readDatagram()函数读取数据报文的内容。最后,可以根据业务需求进行对接收数据的处理。
请注意,以上示例仅为演示UDP客户端的基本逻辑,实际的客户端编程可能还需要处理各种异常情况,进行错误处理,以及定时发送数据等。
3.基于TCP的网络聊天室程序
3.1 TCP工作原理
TCP(Transmission Control Protocol)是一种可靠的、面向连接的传输层协议,用于在网络上传输数据。它提供了以下主要功能:
-
连接建立:在通信双方之间建立一个可靠的连接,形成一个数据传输通道。
-
可靠性:通过使用序列号、确认应答、重传机制等,确保数据的可靠传输。如果数据丢失或损坏,TCP会要求对方重新发送。
-
拥塞控制:通过动态调整发送速率,避免网络拥塞,保持良好的网络性能。
-
面向字节流:TCP把数据看作是一连串的无结构的字节流,没有明确的数据报文边界。TCP会保持字节的顺序,并对字节进行分割和重组。
-
流量控制:通过滑动窗口机制,控制发送方的发送速率,使接收方能够及时处理接收到的数据。
-
超时重传:如果一段时间内没有收到对方的确认应答,TCP会重新发送之前发送的数据。
TCP的工作原理如下:
-
三次握手建立连接:
- 客户端发送一个SYN(同步)报文给服务端,请求建立连接。
- 服务端接收到SYN报文后,回复一个SYN+ACK(同步+确认)报文,表示同意建立连接。
- 客户端收到服务端的SYN+ACK报文后,再回复一个ACK(确认)报文,建立连接。
-
数据传输:
- 连接建立后,可以进行数据的传输。客户端通过发送数据报文给服务端,服务端接收到数据后进行处理。
- 数据报文按序列号分割成报文段,并发送给接收方。
- 接收方收到报文段后,根据序列号进行排序和重组,然后交给应用层进行处理。
-
连接释放:
- 当数据传输结束后,或者发生异常情况时,需要关闭连接。
- 一方发送一个FIN(结束)报文给对方,表示要关闭连接。
- 接收方收到FIN报文后,回复一个ACK报文进行确认。
- 接收方也可以发送一个FIN报文给发送方,表示同意关闭连接。
- 最后,发送方收到ACK报文后,连接关闭。
通过以上的握手和释放过程,TCP协议可以确保可靠的数据传输,并提供了流量控制和拥塞控制机制,使得数据在网络上能够高效、可靠地传输。
3.2 TCP编程模型
TCP编程模型是一种基于TCP协议的网络编程模型,用于实现网络应用程序的通信。它包括以下几个步骤:
-
创建Socket:在客户端和服务器端分别创建一个Socket对象,用于建立连接并进行数据的传输。客户端需要指定服务器的IP地址和端口号,而服务器只需指定一个监听的端口号。
-
建立连接:客户端通过调用Socket对象的connect()方法,向指定的服务器地址和端口号发起连接请求。如果连接成功,客户端和服务器端都会创建一个TCP连接。
-
数据发送和接收:连接建立后,客户端和服务器端可以通过Socket对象的send()和recv()方法来发送和接收数据。客户端可以将需要发送的数据通过send()方法发送给服务器端,而服务器则通过recv()方法接收客户端发送的数据。
-
关闭连接:当通信结束后,客户端和服务器端均需要调用Socket对象的close()方法来关闭连接。
在TCP编程模型中,客户端和服务器端的代码逻辑有所不同:
客户端代码逻辑:
- 创建Socket对象;
- 连接服务器;
- 发送数据;
- 接收数据;
- 关闭连接。
服务器端代码逻辑:
- 创建Socket对象;
- 绑定监听端口;
- 进入监听状态,等待客户端连接;
- 接收连接请求;
- 接收数据;
- 发送数据;
- 关闭连接。
需要注意的是,TCP编程模型是基于阻塞IO的,即当一个操作被执行时,程序会一直等待该操作完成后再继续执行下一步操作。如果需要实现非阻塞IO,可以使用多线程或异步IO等方式来实现。
3.3 TCP服务器编程
在QT5中编写TCP服务器程序的步骤如下:
- 导入所需的QT相关模块:
#include <QTcpServer>
#include <QTcpSocket>
- 创建QTcpServer对象和QTcpSocket对象:
QTcpServer *server = new QTcpServer;
QTcpSocket *socket;
- 监听客户端连接请求并处理:
bool success = server->listen(QHostAddress::Any, 1234); // 监听任意地址的1234端口
if(!success) {// 监听失败的处理逻辑
}// 当有客户端连接请求时,执行连接事件的处理函数
connect(server, &QTcpServer::newConnection, [=]() {socket = server->nextPendingConnection(); // 接受连接请求并返回一个新的socket对象// 连接建立成功的处理逻辑// 处理接收到的数据connect(socket, &QTcpSocket::readyRead, [=]() {QByteArray data = socket->readAll(); // 读取接收到的数据// 处理接收到的数据的逻辑});// 处理连接断开connect(socket, &QTcpSocket::disconnected, [=]() {socket->deleteLater(); // 删除socket对象});
});
- 在需要发送数据时,使用QTcpSocket对象来发送数据:
socket->write("Hello, client!");// 发送数据
- 关闭服务器:
server->close();
注:以上代码只是简单的示例,实际应用中需根据具体情况进行修改和完善。
3.4 TCP客户端编程
在QT5中编写TCP客户端程序的步骤如下:
- 导入所需的QT相关模块:
#include <QTcpSocket>
- 创建QTcpSocket对象:
QTcpSocket *socket = new QTcpSocket;
- 连接到服务器:
socket->connectToHost("服务器IP", 1234); // 连接到服务器的IP和端口号
if(socket->waitForConnected()) {// 连接成功的处理逻辑
} else {// 连接失败的处理逻辑
}
- 处理接收到的数据:
connect(socket, &QTcpSocket::readyRead, [=]() {QByteArray data = socket->readAll(); // 读取接收到的数据// 处理接收到的数据的逻辑
});
- 在需要发送数据时,使用QTcpSocket对象来发送数据:
socket->write("Hello, server!"); // 发送数据
- 关闭连接:
socket->close();
注:以上代码只是简单的示例,实际应用中需根据具体情况进行修改和完善。
4.QT网络应用开发初步
4.1 简单网页浏览器
在QT5中编写一个简单的网页浏览器,需要使用QT的QWebEngineView
类来显示网页内容。以下是一个基本的示例:
- 导入所需的QT相关模块:
#include <QApplication>
#include <QWebEngineView>
- 创建一个
QWebEngineView
对象并设置其大小和标题:
QWebEngineView *view = new QWebEngineView;
view->resize(800, 600); // 设置窗口大小
view->setWindowTitle("Simple Web Browser"); // 设置窗口标题
- 加载网页:
view->load(QUrl("http://www.example.com")); // 加载指定网页
- 显示窗口:
view->show(); // 显示窗口
- 运行应用程序:
return QApplication::exec(); // 运行QT应用程序的事件循环
完整的示例代码如下:
#include <QApplication>
#include <QWebEngineView>int main(int argc, char *argv[])
{QApplication a(argc, argv);QWebEngineView *view = new QWebEngineView;view->resize(800, 600);view->setWindowTitle("Simple Web Browser");view->load(QUrl("http://www.example.com"));view->show();return QApplication::exec();
}
可以根据需要修改网页的URL和窗口大小等参数。编译运行该示例代码,即可打开一个简单的网页浏览器窗口,并加载指定的网页。
4.2 文件下载实例
在QT5中实现文件下载可以使用QNetworkAccessManager
和QNetworkReply
类。以下是一个简单的示例:
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QString url = "https://www.example.com/file.txt"; // 下载文件的URLQString savePath = "/path/to/save/file.txt"; // 保存文件的路径QNetworkAccessManager manager;QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(url)));// 连接下载完成的信号QObject::connect(reply, &QNetworkReply::finished, [&a, reply, savePath]() {if (reply->error() == QNetworkReply::NoError) {QFile file(savePath);if (file.open(QIODevice::WriteOnly)) {file.write(reply->readAll());file.close();qDebug() << "File downloaded successfully.";} else {qDebug() << "Failed to open file for writing.";}} else {qDebug() << "Download failed:" << reply->errorString();}reply->deleteLater();a.quit();});return a.exec();
}
在上面的示例中,我们创建了一个QNetworkAccessManager
对象,并使用get()
函数发起一个GET请求来下载文件。然后,我们连接QNetworkReply
对象的finished()
信号,当下载完成时,会触发该信号,我们在该信号的槽函数中将文件保存到指定的路径。如果下载过程中出错,我们会输出错误信息。最后,我们调用a.quit()
来退出应用程序。
请注意将https://www.example.com/file.txt
替换为实际的文件下载链接,并将/path/to/save/file.txt
替换为文件保存的实际路径。
编译运行该示例代码,即可实现文件下载功能。
相关文章:
QT基础篇(10)QT5网络与通信
QT5网络与通信是指在QT5开发环境中使用网络进行数据传输和通信的相关功能和技术。 QT5提供了一套完善的网络模块,包括了TCP、UDP、HTTP等协议的支持,可以方便地在QT应用程序中进行网络通信。通过QT5的网络模块,开发者可以实现客户端和服务器…...
【Leetcode】269.火星词典(Hard)
一、题目 1、题目描述 现有一种使用英语字母的火星语言,这门语言的字母顺序与英语顺序不同。 给你一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序…...
opencv_模型训练
文件夹 opencv训练文件 xml negdataposdata 说明 negdata目录: 放负样本的目录 posdata目录: 放正样本的目录 xml目录: 新建的一个目录,为之后存放分类器文件使用 neg.txt: 负样本路径列表 pos.txt: 正样本路径列表 pos.vec: 后续自动生成…...

python PyQt5的学习
一、安装与配置 1、环境: python3.7 2、相关模块 pip install pyqt5 pyqt5-tools pyqt5designer 可以加个镜像 -i https://pypi.tuna.tsinghua.edu.cn/simple3、配置设计器 python的pyqt5提供了一个设计器,便于ui的设计 界面是这样的:…...

3.goLand基础语法
目录 概述语法for常量与变量数组切片 slice切片问题问题1问题2 Make 和 New结构体和指针结构体标签 结束 概述 从 java 转来学 go ,在此记录,方便以后翻阅。 语法 for package mainimport "fmt"func main() {for i : 0; i < 3; i {fmt.…...

计算机硬件 5.2组装整机
第二节 组装整机 一、准备工作 1.常用工具:中号十字螺丝刀、尖嘴钳、软毛刷、防静电手环等。 2.组装原则: ①按“先小后大”“从里到外”的顺序进行,不遗漏每一环节,不“带病”进行下一环节。 ②合理使用工具器材,…...

Docker搭建MySQL主从数据库-亲测有效
1、测试环境概述 1、使用MySQL5.7.35版本 2、使用Centos7操作系统 3、使用Docker20版本 案例中描述了整个测试的详细过程 2、安装Docker 2.1、如果已经安装docker,可以先卸载 yum remove -y docker \ docker-client \ docker-client-latest \ docker-common \ docker-l…...
PyTorch 中的距离函数深度解析:掌握向量间的距离和相似度计算
目录 Pytorch中Distance functions详解 pairwise_distance 用途 用法 参数 数学理论公式 示例代码 cosine_similarity 用途 用法 参数 数学理论 示例代码 输出结果 pdist 用途 用法 参数 数学理论 示例代码 总结 Pytorch中Distance functions详解 pair…...
【Vue技巧】vue3中不支持.sync语法糖的解决方案
海鲸AI-ChatGPT4.0国内站点,支持设计稿转代码:https://www.atalk-ai.com 在 Vue 3 中,.sync 修饰符已经被移除。在 Vue 2 中,.sync 修饰符是一个语法糖,用于简化子组件和父组件之间的双向数据绑定。在 Vue 3 中&#x…...

设计模式⑦ :简单化
文章目录 一、前言二、Facade 模式1. 介绍2. 应用3. 总结 三、Mediator 模式1. 介绍2. 应用3. 总结 一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容…...

Java:选择哪个Java IDE好?
Java:选择哪个Java IDE好? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&…...
unity打包apk后网络请求提示unknown error处理
近期同事的一个比较老的版本的unity项目在电脑上运行都正常,但是打包成android后安装到手机上就提示unknown error 让我帮他排查一下问题。由于是涉密项目不能发图就简单介绍下处理过程吧! 一、故障原因 请求的地址ssl证书过期了。 二、处理过程 更改请…...

力扣 | 11. 盛最多水的容器
双指针解法–对撞指针 暴力解法public int maxArea1(int[] height) {int n height.length;int ans 0;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {int area Math.min(height[i], height[j]) * (j - i);ans Math.max(ans, area);}}return ans;}双指针解法…...

史上最全EasyExcel
一、EasyExcel介绍 1、数据导入:减轻录入工作量 2、数据导出:统计信息归档 3、数据传输:异构系统之间数据传输 二、EasyExcel特点 Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内…...
MySQL---事务的四大特性详解(高频面试题)
在MySQL中,事务具有以下四个基本特性: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些特性通常被称为ACID特性。 一…...

为 OpenCV 编写文档(二)
常用命令 这里通过简短的示例描述了最常用的 doxygen 命令。有关可用命令的完整列表和详细说明,请访问命令参考。 基本命令 brief - 带有简要实体描述的段落 param - 函数参数的描述。 多个相邻语句合并到一个列表中。如果在实际函数签名中找不到具有此名称的参数…...

HUAWEI华为MateStation S台式机电脑12代PUC-H7621N,H5621N原装出厂Windows11.22H2系统
链接:https://pan.baidu.com/s/1QtjLyGTwMZgYiBO5bUVPYg?pwd8mx0 提取码:8mx0 原厂WIN11系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、Office办公软件、华为电脑管家等预装程序 文件格式:esd/wim/swm 安装方式…...

机器学习:holdout法(Python)
import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder, StandardScaler # 类别标签编码,标准化处理 from sklearn.decomposition import PCA # 主成分分析 import matplotlib.pyplot as plt from sklearn.model_selection impor…...

【GaussDB数据库】序
参考链接1:国产数据库华为高斯数据库(GaussDB)功能与特点总结 参考链接2:GaussDB(DWS)介绍 GaussDB简介 官方网站:云数据库GaussDB GaussDB是华为自主创新研发的分布式关系型数据库。该产品支持分布式事务,…...

代码随想录算法训练营第三十八天|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
题目:理论基础 文章链接:代码随想录 视频链接:动态规划理论基础 动态规划五部曲: 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 题目:509. 斐…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...