QT 网络编程 数据库模块 TCP UDP QT5.12.3环境 C++实现

一、网络编程

1. 模块引入

QT += network 

2. 头文件

#include <QTcpServer>  //TCP服务端使用
#include <QTcpSocket>  //TCP服务器和客户端都使用

3. TCP网络编程流程

1) 服务端
实例化QTcpServer对象----------------------------->socket
进入监听状态--listen(QTcpServer)  //不需要再绑定了----------->bind + listen
监测客户端连接--newConnection信号(QTcpServer)---------------->有新连接过来,server就能收到newConnection信号
QTcpSocket *client<--获得连接--nextPendingConnection(QTcpServer)------------------>accept
连接对端接收信号--readyRead(QTcpSocket)---------------------->如果对端有数据发送,server就能收到readyRead信号
读取客户端消息--readAll(QTcpSocket)-------------------------->recv:读取数据
发送数据--write(QTcpSocket)--->send:发数据
断开连接--disconnectFromHost()------------------->close
关闭服务端--close()
2) 客户端
实例化QTcpSocket对象
连接服务器--connectToHost--->接着使用waitForConnected来判断是否连接成功
连接对端接收信号--readyRead
发送数据--write()
关闭连接--disconnectFromHost()

二、类和常用接口

1. QTcpServer
 

//构造监听套接字对象
QTcpServer(QObject *parent = nullptr)

//进入监听状态
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
QHostAddress::Any  = 0.0.0.0  //表示监听任何地址
port = 0 //QT会选择一个合适的端口号

//与请求连接的客户端连接,返回与客户端通讯套接字地址
virtual QTcpSocket *nextPendingConnection()

//返回服务端的IP地址
QHostAddress serverAddress() const

//返回服务端的PORT端口号
quint16 serverPort() const

signals:
void newConnection()  //有客户端请求连接,监听套接字对象发出该信号

2. QTcpSocket

//构造通讯套接字
QTcpSocket(QObject *parent = nullptr)

//连接服务端
virtual void connectToHost(const QHostAddress &address, quint16 port, QIODevice::OpenMode openMode = ReadWrite)


//阻塞等待连接服务器,最多等待msecs毫秒,如果连接成功,返回true,连接失败返回false
virtual bool waitForConnected(int msecs = 30000)

//判断套接字是否有效
bool isValid() const

//断开连接
virtual void disconnectFromHost()


//获取通讯对端IP地址
QHostAddress peerAddress() const

//获取通讯对端的PORT端口号
quint16 peerPort() const

//读取所有数据
QByteArray readAll()

//写数据
qint64 write(const QByteArray &byteArray)

signals:
void readyRead();//如果对端发来数据,通讯套接字发出该信号

注意: 在读写数据时,一定要注意编码的问题,否则会出现乱码的情况。

3. 连接到服务器典型代码

socket->connectToHost("imap", 143);
if (socket->waitForConnected(1000))
    qDebug("Connected!");

三、UDP编程

1. 模块引入

QT += network

2. 头文件

#include <QUdpSocket>

3. 编程流程

实例化QUdpSocket对象----------------------------------->socket
绑定地址、端口--bind(QHostAddress::LocalHost, 8888)---->bind
收发报文--readDatagram、writeDatagram------------------>recvfrom/sendto

可参考QUdpSocket帮助文档的Detailed Description的案例代码


四、类和接口

1. QUdpSocket
bool QUdpSocket::hasPendingDatagrams() const
qint64 QUdpSocket::readDatagram(char * data, qint64 maxSize, QHostAddress * address = 0, quint16 * port = 0)
qint64 QUdpSocket::writeDatagram(const char * data, qint64 size, const QHostAddress & address, quint16 port)

五、数据库

1. 模块引入

QT += sql

2. 头文件

#include <QSqlDatabase> //管理数据库连接的类
#include <QSqlQuery> //执行sql语句
#include <QSqlError> //输出错误信息

3. 编程流程

1) 在.pro工程文件中添加sql模块

2) 创建QSqlDatabase栈对象和QSqlquery堆对象

3) 利用db对象加载数据库驱动文件

4) 利用db对象,设置本地数据库文件名称

5) 利用db对象调用open函数打开数据库  //打开数据库后,可以在当前构建目录中查看该数据库

6) 利用query对象调用exec像数据库发送sql

7) 关闭数据库

4. 示例代码

//加载数据库的驱动
db = QSqlDatabase::addDatabase("QSQLITE");

//设置本地数据库文件
db.setDatabaseName("stu.db");

//打开数据库
if(db.open()){
    qDebug() << "打开成功....";
}
else {
    qDebug() << "打开失败....";
}

//向数据库发送sql语句
query = new QSqlQuery;

if(query->exec("create  table  stu_info  (学号  int,  姓名 char(32), 成绩  double)")){
    qDebug() << "创建表格成功" ;
}
else {
    qDebug() << "创建表格失败: " << query->lastError().text();
}

//关闭数据库
db.close();
注意:因为QSqlQuery 不支持指定对象,所以要在析构函数中加上如下语句。
delete  query;

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

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

相关文章

使用ENSP实现NAT

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为12.12.12.1/30 ip address 12.12.12.1 30进入e0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置…

Python的tkinter如何把日志弄进文本框(Text)

当我们用python的Tkinter包给程序设计界面时&#xff0c;在有些时候&#xff0c;我们是希望程序的日志显示在界面上的&#xff0c;因为用户也需要知道程序目前运行到哪一步了&#xff0c;以及程序当前的运行状态是否良好。python的通过print函数打印出来的日志通常显示在后台&a…

flux的版本

1.flux1-dev.safetensors https://huggingface.co/black-forest-labs/FLUX.1-devhttps://huggingface.co/black-forest-labs/FLUX.1-dev原生的23.8G的模型。原生12B的模型,float16的。需要配合ae.safetensors,flux1-dev.safetensors以及clip-l和T5的权重使用,注意ae.sft和f…

阿里云私服地址

1.解压apache-maven-3.6.1-bin 2.配置本地仓库&#xff1a;修改conf/dettings.xml中的<localReoisitory>为一个指定目录。56行 <localRepository>D:\apache-maven-3.6.1-bin\apache-maven-3.6.1\mvn_repo</localRepository> 3.配置阿里云私服&#xff1a;…

【大数据学习 | Spark-Core】yarn-client与yarn-cluster的区别

1. yarn的提交命令 # yarn的提交命令参数 --master yarn #执行集群 --deploy-mode # 部署模式 --class #指定运行的类 --executor-memory #指定executor的内存 --executor-cores # 指定核数 --num-executors # 直接指定executor的数量 --queue # 指定队列 2. yarn-client模式…

【汽车制动】汽车制动相关控制系统

目录 1.ABS (Anti-lock Brake System&#xff0c;防抱死制动系统) 2.EBD&#xff08;Electronic Brake-force Distribution&#xff0c;电子制动力分配系统&#xff09; 3.TCS&#xff08;Traction Control System&#xff0c;牵引力控制系统&#xff09; 4.VDC&#xff08…

《TCP/IP网络编程》学习笔记 | Chapter 15:套接字与标准 I/O

《TCP/IP网络编程》学习笔记 | Chapter 15&#xff1a;套接字与标准 I/O 《TCP/IP网络编程》学习笔记 | Chapter 15&#xff1a;套接字与标准 I/O标准 I/O 函数标准 I/O 函数的两个优点标准 I/O 函数和系统函数之间的性能对比标准 I/O 函数的几个缺点 使用标准 I/O 函数利用 fd…

<OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools

原因 想用 apt-get download 存到本地 / NAS上&#xff0c;减少网络流浪。 看到 VMware 上的确实有 ubuntu&#xff0c;只是版本是16。 ubuntu 版本比较&#xff1a;LTS vs RR LTS: Long-Term Support 长周期支持&#xff0c; 一般每 2 年更新&#xff0c;会更可靠与更稳定…

支持多种快充协议和支持多种功能的诱骗取电协议芯片

汇铭达XSP15是一款应用于手持电动工具、智能家居、显示器、音箱等充电方案的大功率快充协议芯片&#xff0c;支持最大功率100W给设备快速充电&#xff0c;大大缩短了充电时间。芯片支持通过UART串口发送电压/电流消息供其它芯片读取。支持自动识别连接的是电脑或是充电器。支持…

【一篇搞定配置】网络分析工具WireShark的安装与入门使用

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…

JavaWeb之综合案例

前言 这一节讲一个案例 1. 环境搭建 然后就是把这些数据全部用到sql语句中执行 2.查询所有-后台&前台 我们先写后台代码 2.1 后台 2.2 Dao BrandMapper&#xff1a; 注意因为数据库里面的名称是下划线分割的&#xff0c;我们类里面是驼峰的&#xff0c;所以要映射 …

【STM32】MPU6050初始化常用寄存器说明及示例代码

一、MPU6050常用配置寄存器 1、电源管理寄存器1&#xff08; PWR_MGMT_1 &#xff09; 此寄存器允许用户配置电源模式和时钟源。 DEVICE_RESET &#xff1a;用于控制复位的比特位。设置为1时复位 MPU6050&#xff0c;内部寄存器恢复为默认值&#xff0c;复位结束…

隐私友好型分析平台Plausible Analytics

什么是 Plausible Analytics &#xff1f; Plausible Analytics 是一个简单、轻量级&#xff08;小于1KB&#xff09;、开源且隐私友好的网站分析工具&#xff0c;旨在作为 Google Analytics 的替代品。它不使用 cookies 并且完全符合 GDPR、CCPA 和 PECR 法规&#xff0c;因此…

Flutter:RotationTransition旋转动画

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationController late AnimationController _controller;overridevoid initState() {super…

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…

青训营刷题笔记16

问题描述 小R从班级中抽取了一些同学&#xff0c;每位同学都会给出一个数字。已知在这些数字中&#xff0c;某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。 测试样例 样例1&#xff1a; 输入&#xff1a;array [1, 3, 8, 2, 3, 1, 3, 3, 3] 输出…

C4D技巧总结

鼠标右键单击这两个小箭头可以把参数恢复到默认值&#xff01; 对象坐标 全局坐标 按住Alt键&#xff0c;点击挤压&#xff08;或者其他绿色的图标&#xff09;&#xff0c;可以快速形成父子级效果&#xff01;

(动画)Qt控件 QLCDNumer

文章目录 LCD Number1. 介绍2. 核心属性3 . 代码实现:倒计时1. 在界⾯上创建⼀个 QLCDNumber , 初始值设为 10.2. 修改 widget.h 代码, 创建⼀个 QTimer 成员, 和⼀个 updateTime 函数3. 修改 widget.cpp, 在构造函数中初始化 QTimer4. 修改 widget.cpp, 实现 updateTime 4. 动…

draggable的el-dialog实现对话框标题可以选择

请看图 这个对话框使用了el-dialog并且draggable属性设置成了true&#xff0c;所以标题栏这里就可以拖动&#xff0c;现在用户想选中标题栏的文本进而复制。我看到这个需求头都大了。 我能想到的方案有三个&#xff1a;1. 取消draggable为true 2. 标题文案后面加一个复制按钮 …

DeepSpeed-chat RLHF实战

轩辕-6bRLHF落地实战 模型介绍&#xff1a;轩辕-6B 模型库 (modelscope.cn) 1.1偏好数据集构建 ​ 1.1.1Prompt构建 1.1.2 Response生成 保证RM训练数据和测试数据分布一致 使用模型来生成response&#xff0c;为了评价response的质量&#xff0c;可以提高采样参数中的…