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

QT--------网络

实现思路

  1. 主机信息查询
    • 使用 QHostInfo 类可以查询主机名和 IP 地址信息。
    • QNetworkInterface 类可以获取本地网络接口的信息,包括 IP 地址、子网掩码、广播地址等。
  2. TCP 通信
    • 使用 QTcpServer 类实现 TCP 服务器端程序设计。
    • 使用 QTcpSocket 类实现 TCP 客户端程序设计。
  3. UDP 通信
    • 使用 QUdpSocket 类实现 UDP 单播、广播和组播。
  4. 基于 HTTP 的网络应用程序
    • 使用 QNetworkAccessManager 类和 QNetworkRequest 类进行 HTTP 请求。

代码示例

1. 主机信息查询
#include <QtWidgets/QApplication>
#include <QtNetwork/QHostInfo>
#include <QtNetwork/QNetworkInterface>
#include <QtCore/QDebug>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    // 使用 QHostInfo 查询主机信息
    QHostInfo::lookupHost("www.qt.io", [](const QHostInfo &host) {
        if (host.error() == QHostInfo::NoError) {
            qDebug() << "Host name:" << host.hostName();
            foreach (const QHostAddress &address, host.addresses()) {
                qDebug() << "IP Address:" << address.toString();
            }
        } else {
            qDebug() << "Lookup failed:" << host.errorString();
        }
    });


    // 使用 QNetworkInterface 获取网络接口信息
    QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
    foreach (const QNetworkInterface &interface, interfaces) {
        qDebug() << "Interface name:" << interface.name();
        qDebug() << "Hardware address:" << interface.hardwareAddress();
        foreach (const QNetworkAddressEntry &entry, interface.addressEntries()) {
            qDebug() << "IP address:" << entry.ip().toString();
            qDebug() << "Subnet mask:" << entry.netmask().toString();
            qDebug() << "Broadcast address:" << entry.broadcast().toString();
        }
    }


    return app.exec();
}
2. TCP 服务器端程序设计
#include <QtWidgets/QApplication>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>
#include <QtCore/QDebug>


class TcpServer : public QTcpServer {
    Q_OBJECT
public:
    TcpServer(QObject *parent = nullptr) : QTcpServer(parent) {
        if (listen(QHostAddress::Any, 12345)) {
            qDebug() << "Server is listening on port 12345";
        } else {
            qDebug() << "Server failed to start:" << errorString();
        }
    }


protected slots:
    void incomingConnection(qintptr socketDescriptor) override {
        QTcpSocket *socket = new QTcpSocket(this);
        if (socket->setSocketDescriptor(socketDescriptor)) {
            qDebug() << "Client connected:" << socket->peerAddress().toString();
            connect(socket, &QTcpSocket::readyRead, this, [socket]() {
                QByteArray data = socket->readAll();
                qDebug() << "Received from client:" << data;
                socket->write("Hello from server");
            });
            connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
        } else {
            qDebug() << "Failed to set socket descriptor:" << socket->errorString();
        }
    }
};


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    TcpServer server;


    return app.exec();
}


#include "main.moc"
3. TCP 客户端程序设计
#include <QtWidgets/QApplication>
#include <QtNetwork/QTcpSocket>
#include <QtCore/QDebug>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    QTcpSocket socket;
    socket.connectToHost("127.0.0.1", 12345);


    connect(&socket, &QTcpSocket::connected, []() {
        qDebug() << "Connected to server";
    });


    connect(&socket, &QTcpSocket::readyRead, [&socket]() {
        QByteArray data = socket.readAll();
        qDebug() << "Received from server:" << data;
    });


    socket.write("Hello from client");


    return app.exec();
}
4. UDP 通信
#include <QtWidgets/QApplication>
#include <QtNetwork/QUdpSocket>
#include <QtCore/QDebug>


// UDP 单播
void udpUnicast() {
    QUdpSocket socket;
    QHostAddress serverAddress("127.0.0.1");
    quint16 port = 12345;


    socket.writeDatagram("Hello from client", serverAddress, port);


    QByteArray buffer;
    buffer.resize(socket.pendingDatagramSize());
    QHostAddress sender;
    quint16 senderPort;
    socket.readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);
    qDebug() << "Received from server:" << buffer;
}


// UDP 广播
void udpBroadcast() {
    QUdpSocket socket;
    socket.bind(QHostAddress::Any, 12345);


    QHostAddress broadcastAddress = QHostAddress::Broadcast;
    quint16 port = 12345;


    socket.writeDatagram("Hello from client", broadcastAddress, port);


    QByteArray buffer;
    buffer.resize(socket.pendingDatagramSize());
    QHostAddress sender;
    quint16 senderPort;
    socket.readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);
    qDebug() << "Received from server:" << buffer;
}


// UDP 组播
void udpMulticast() {
    QUdpSocket socket;
    QHostAddress groupAddress("239.255.43.21");
    quint16 port = 12345;


    socket.bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress);
    socket.joinMulticastGroup(groupAddress);


    socket.writeDatagram("Hello from client", groupAddress, port);


    QByteArray buffer;
    buffer.resize(socket.pendingDatagramSize());
    QHostAddress sender;
    quint16 senderPort;
    socket.readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);
    qDebug() << "Received from server:" << buffer;
}


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    // 调用不同的 UDP 通信函数
    udpUnicast();
    // udpBroadcast();
    // udpMulticast();


    return app.exec();
}

在这里插入图片描述

5. 基于 HTTP 的网络应用程序
#include <QtWidgets/QApplication>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtCore/QDebug>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    QNetworkAccessManager manager;
    QNetworkRequest request(QUrl("http://www.example.com"));


    QNetworkReply *reply = manager.get(request);


    connect(reply, &QNetworkReply::finished, [reply]() {
        if (reply->error() == QNetworkReply::NoError) {
            QByteArray data = reply->readAll();
            qDebug() << "Received from server:" << data;
        } else {
            qDebug() << "Error:" << reply->errorString();
        }
        reply->deleteLater();
    });


    return app.exec();
}

代码解释

1. 主机信息查询
  • QHostInfo
    • QHostInfo::lookupHost 是一个异步操作,会在完成后调用传入的 lambda 函数,根据结果可以获取主机名和 IP 地址。
  • QNetworkInterface
    • QNetworkInterface::allInterfaces 获取所有网络接口信息,包括接口名称、硬件地址和地址条目,地址条目包含 IP 地址、子网掩码和广播地址。
2. TCP 服务器端程序设计
  • TcpServer 类
    • 继承 QTcpServer,在构造函数中调用 listen 监听端口 12345。
    • incomingConnection 槽函数在有新连接时被调用,创建 QTcpSocket 并处理数据收发。
3. TCP 客户端程序设计
  • QTcpSocket
    • 使用 connectToHost 连接服务器,通过 readyRead 信号接收数据,使用 write 发送数据。
4. UDP 通信
  • udpUnicast
    • 使用 QUdpSocket 向指定地址发送和接收数据。
  • udpBroadcast
    • 向广播地址发送数据,使用 bind 接收数据。
  • udpMulticast
    • 使用 joinMulticastGroup 加入组播组,向组播地址发送和接收数据。
5. 基于 HTTP 的网络应用程序
  • QNetworkAccessManager
    • 使用 get 方法发送 HTTP GET 请求,通过 QNetworkReplyfinished 信号获取结果或错误信息。

使用说明

  • 对于每个示例,将代码保存为 main.cpp 文件。
  • 确保 .pro 文件包含 QT += network widgets 以及 CONFIG += c++11
  • 编译并运行程序,观察网络通信的效果。

在这里插入图片描述


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

相关文章:

  • 电脑中缺失的nvrtc64_90.dll文件如何修复?
  • uni-ui样式修改
  • SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)
  • AWS EMR上的Spark用Kafka搜集大数据日志Tableau报表展示的设计和实现
  • nacos 笔记2-配置中心
  • 使用CSS 和 JavaScript 实现鼠标悬停时图片放大、缩小和抖动
  • Linux驱动开发学习准备(Linux内核源码添加到工程-Workspace)
  • SpringCloud源码分析-Gateway
  • Elasticsearch DSL版
  • 从企业级 RAG 到 AI Assistant,阿里云 Elasticsearch AI 搜索技术实践
  • C语言面的向对象编程(OOP)
  • 高效管理deepin和Docker中的后台任务
  • 如何查看docker默认的网段的4种办法
  • [python SQLAlchemy数据库操作入门]-16.CTE:简化你的复杂查询
  • 计算机网络•自顶向下方法:路由选路算法
  • neo4j学习笔记
  • Kali Linux 和Xshell的安装和使用
  • java04 1个简单程序/ 输入输出/ 方法(子函数)/ 数组
  • Windows注册表的HKEY_CLASSES_ROOT是HKEY_LOCAL_MACHINE\SOFTWARE\Classes合并HKEY_CURRENT_USER\Software\Classes
  • HCIE-day9-OSPF2