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 套接字对象
};