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
  • 编译并运行程序,观察网络通信的效果。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~jing静

ლ(°◕‵ƹ′◕ლ)让我一键努

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值