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

一、网络编程

1. 模块引入

cpp 复制代码
QT += network 

2. 头文件

cpp 复制代码
#include <QTcpServer>  //TCP服务端使用
#include <QTcpSocket>  //TCP服务器和客户端都使用

3. TCP网络编程流程

1) 服务端
cpp 复制代码
实例化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) 客户端
cpp 复制代码
实例化QTcpSocket对象
连接服务器--connectToHost--->接着使用waitForConnected来判断是否连接成功
连接对端接收信号--readyRead
发送数据--write()
关闭连接--disconnectFromHost()

二、类和常用接口

1. QTcpServer

cpp 复制代码
//构造监听套接字对象
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

cpp 复制代码
//构造通讯套接字
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. 连接到服务器典型代码

cpp 复制代码
socket->connectToHost("imap", 143);
if (socket->waitForConnected(1000))
    qDebug("Connected!");

三、UDP编程

1. 模块引入

cpp 复制代码
QT += network

2. 头文件

cpp 复制代码
#include <QUdpSocket>

3. 编程流程

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

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


四、类和接口

1. QUdpSocket
cpp 复制代码
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. 模块引入

cpp 复制代码
QT += sql

2. 头文件

cpp 复制代码
#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. 示例代码

cpp 复制代码
//加载数据库的驱动
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 不支持指定对象,所以要在析构函数中加上如下语句。
cpp 复制代码
delete  query;
相关推荐
Joy T14 分钟前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡34 分钟前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
Aloudata34 分钟前
Claude 做数据分析的这两年:一份复盘与发展线索
大数据·数据库·人工智能·数据挖掘·数据分析·dataagent
Decay__1 小时前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构
自信150413057591 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
zhanghaha13141 小时前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
韩曙亮1 小时前
【错误记录】安卓 adb 调试 5037 端口占用排查 ( adb 的三层结构 | 找出本机占用 5037 的进程 )
android·数据库·adb·安卓·错误记录
瑞雪兆丰年兮1 小时前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web
ShineWinsu4 小时前
对于Qt:QDial常见属性以及信号的解析
开发语言·c++·qt·gui·客户端·旋钮·qdial
lsc_blog6 小时前
年终自评别贴提交记录,把技术产出讲成变化
数据库·面试·职场和发展·跳槽·求职招聘