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

QT基础教程(QT网络编程)

文章目录

  • 前言
  • 一、Qt 网络编程概述
  • 二、HTTP 网络编程
  • 三、TCP 网络编程
  • 四、UDP 网络编程


前言

Qt 提供了丰富的网络编程支持,通过 Qt Network 模块可以方便地实现网络通信。这个模块提供了用于处理网络协议、创建网络应用程序和进行网络操作的类。

一、Qt 网络编程概述

Qt 的网络编程框架主要包括以下几个关键类:

QNetworkAccessManager:用于处理网络请求和响应。
QNetworkReply:表示一个网络请求的响应。
QNetworkRequest:表示一个网络请求。
QTcpSocket 和 QTcpServer:用于 TCP 连接和服务器。
QUdpSocket:用于 UDP 连接。
QHttpMultiPart 和 QHttpPart:用于处理多部分 HTTP 请求,例如文件上传。

二、HTTP 网络编程

使用 QNetworkAccessManager 发起 HTTP 请求并处理响应。

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QDebug>

class NetworkManager : public QObject
{
    Q_OBJECT

public:
    NetworkManager(QObject *parent = nullptr) : QObject(parent)
    {
        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
        connect(manager, &QNetworkAccessManager::finished, this, &NetworkManager::onReplyFinished);

        QNetworkRequest request(QUrl("http://www.example.com"));
        manager->get(request);
    }

private slots:
    void onReplyFinished(QNetworkReply *reply)
    {
        if (reply->error() == QNetworkReply::NoError) {
            QByteArray response = reply->readAll();
            qDebug() << "Response:" << response;
        } else {
            qDebug() << "Error:" << reply->errorString();
        }
        reply->deleteLater();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    NetworkManager networkManager;

    return a.exec();
}


三、TCP 网络编程

TCP服务器

#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>

class TcpServer : public QObject
{
    Q_OBJECT
public:
    TcpServer(QObject *parent = nullptr) {
        // 创建一个 TCP 服务器
        server = new QTcpServer(this);

        // 当有新连接时触发 `newConnection` 信号
        connect(server, &QTcpServer::newConnection, this, &TcpServer::onNewConnection);

        // 监听任意 IP 地址上的端口 12345
        if (!server->listen(QHostAddress::Any, 12345)) {
            qDebug() << "Server failed to start!";
        } else {
            qDebug() << "Server started on port 12345";
        }
    }

private slots:
    void onNewConnection() {
        // 获取新连接的套接字
        QTcpSocket *clientSocket = server->nextPendingConnection();

        // 当客户端发送数据时,触发 readyRead 信号
        connect(clientSocket, &QTcpSocket::readyRead, [clientSocket]() {
            // 读取客户端发送的数据
            QByteArray data = clientSocket->readAll();
            qDebug() << "Received:" << data;

            // 给客户端发送响应数据
            clientSocket->write("Message received\n");
        });

        // 当客户端断开连接时,删除套接字对象
        connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QTcpSocket::deleteLater);
    }

private:
    QTcpServer *server; // TCP 服务器对象
};

TCP客户端

#include <QTcpSocket>
#include <QDebug>

class TcpClient : public QObject
{
    Q_OBJECT
public:
    TcpClient(QObject *parent = nullptr) {
        // 创建一个 TCP 套接字
        socket = new QTcpSocket(this);

        // 当客户端成功连接到服务器时触发 connected 信号
        connect(socket, &QTcpSocket::connected, []() {
            qDebug() << "Connected to server!";
        });

        // 当服务器发送数据时,触发 readyRead 信号
        connect(socket, &QTcpSocket::readyRead, [this]() {
            // 读取服务器发送的数据
            QByteArray data = socket->readAll();
            qDebug() << "Server says:" << data;
        });

        // 连接到服务器 IP 地址 127.0.0.1,端口 12345
        socket->connectToHost("127.0.0.1", 12345);
        if (!socket->waitForConnected(3000)) { // 等待连接,超时 3 秒
            qDebug() << "Connection failed!";
        } else {
            // 连接成功后发送数据到服务器
            socket->write("Hello, server!\n");
        }
    }

private:
    QTcpSocket *socket; // TCP 客户端套接字对象
};

四、UDP 网络编程

UDP服务器

#include <QUdpSocket>
#include <QDebug>

class UdpServer : public QObject
{
    Q_OBJECT
public:
    UdpServer(QObject *parent = nullptr) {
        // 创建一个 UDP 套接字
        socket = new QUdpSocket(this);

        // 绑定到任意 IP 地址上的端口 12345
        if (!socket->bind(QHostAddress::Any, 12345)) {
            qDebug() << "Failed to bind UDP socket!";
        } else {
            qDebug() << "UDP Server started on port 12345";
        }

        // 当有数据到来时触发 readyRead 信号
        connect(socket, &QUdpSocket::readyRead, this, &UdpServer::onReadyRead);
    }

private slots:
    void onReadyRead() {
        // 接收数据
        while (socket->hasPendingDatagrams()) {
            QByteArray buffer;
            buffer.resize(socket->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;

            // 读取数据和发送者信息
            socket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);
            qDebug() << "Received from" << sender.toString() << ":" << senderPort << "->" << buffer;

            // 回复消息
            socket->writeDatagram("Message received", sender, senderPort);
        }
    }

private:
    QUdpSocket *socket; // UDP 套接字对象
};

UDP客户端

#include <QUdpSocket>
#include <QDebug>

class UdpClient : public QObject
{
    Q_OBJECT
public:
    UdpClient(QObject *parent = nullptr) {
        // 创建一个 UDP 套接字
        socket = new QUdpSocket(this);

        // 发送数据到服务器(IP 地址 127.0.0.1,端口 12345)
        QByteArray data = "Hello, UDP Server!";
        socket->writeDatagram(data, QHostAddress("127.0.0.1"), 12345);
        qDebug() << "Sent:" << data;

        // 当有数据到来时触发 readyRead 信号
        connect(socket, &QUdpSocket::readyRead, this, &UdpClient::onReadyRead);
    }

private slots:
    void onReadyRead() {
        // 接收服务器的响应数据
        while (socket->hasPendingDatagrams()) {
            QByteArray buffer;
            buffer.resize(socket->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;

            // 读取数据和发送者信息
            socket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);
            qDebug() << "Received from" << sender.toString() << ":" << senderPort << "->" << buffer;
        }
    }

private:
    QUdpSocket *socket; // UDP 套接字对象
};


http://www.kler.cn/a/407682.html

相关文章:

  • leetcode刷题记录(四十二)——101. 对称二叉树
  • AVL树实现
  • 开源宝藏:Smart-Admin 重复提交防护的 AOP 切面实现详解
  • 大公司如何实现打印机共享的?如何对打印机进行管控或者工号登录后进行打印?异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务?
  • #Verilog HDL# Verilog中的UDP原语
  • CentOS7 如何查看kafka topic中的数据
  • 计算机网络名词解释汇总
  • MySQL 数据库命名及SQL语句书写规范详解
  • Spring ApplicationListener
  • AWTK fscript 中的 大端小端扩展函数
  • 【滤波器】低通、带通、高通滤波器区别及作用
  • 【国产MCU系列】-GD32F470-高级定时器
  • Edify 3D: Scalable High-Quality 3D Asset Generation 论文解读
  • 使用Kubernetes部署第一个应用
  • 华为机试HJ62 查找输入整数二进制中1的个数
  • GESP考试大纲
  • doris的安装部署
  • 用vite下载的react + TS的项目,组件会调用两次
  • Python 快速入门(上篇)❖ Python基础知识
  • 98. 验证二叉搜索树【 力扣(LeetCode) 】
  • 深挖`React`里程碑之作`AutoStore`与`helux`的渊源
  • 开源可视化工具对比:JimuReport VS DataEase
  • Android 设置 bottomnavigation 底部导航栏的样式
  • 【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量
  • 数据指标与标签在数据分析中的关系与应用
  • 计算机网络-VPN虚拟专用网络概述