Qt的网络编程能力非常强大,它提供了从底层socket API到高层HTTP、FTP等协议处理的完整解决方案。下面将简要介绍Qt中网络编程的核心类及其功能,并给出一些基本的使用示例。
核心网络类:
-
QTcpSocket 和 QTcpServer
-
QTcpSocket
是用于TCP通信的客户端类,可以用来创建TCP连接并发送/接收数据。
示例:// 客户端连接到服务器 QTcpSocket *client = new QTcpSocket(this); client->connectToHost("127.0.0.1", 12345);// 连接成功后发送数据 if (client->waitForConnected()) {client->write("Hello Server!");client->disconnectFromHost(); }// 接收数据 connect(client, &QTcpSocket::readyRead, [=](){QByteArray data = client->readAll();qDebug() << "Received data:" << data; });// 监听错误信号 connect(client, static_cast<void(QTcpSocket::*)(QAbstractSocket::SocketError)>(&QTcpSocket::error),[](QAbstractSocket::SocketError error){qDebug() << "Error occurred:" << error;});
-
QTcpServer
用于监听入站TCP连接请求,并创建新的QTcpSocket
实例以处理每个客户端连接。
示例:QTcpServer server; if (!server.listen(QHostAddress::Any, 12345)) {qDebug() << "Unable to start the server: " << server.errorString();return; }connect(&server, &QTcpServer::newConnection, [&](QTcpSocket *socket){qDebug() << "New connection accepted from " << socket->peerAddress();// 处理客户端数据connect(socket, &QTcpSocket::readyRead, [=](){QByteArray data = socket->readAll();qDebug() << "Received data from client: " << data;// 回应客户端socket->write("Hello Client!");});// 关闭连接时的处理connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater); });
-
-
QUdpSocket
-
QUdpSocket
类用于无连接的UDP通信,可以发送和接收数据报文。
发送UDP数据:QUdpSocket udpSocket; udpSocket.bind(QHostAddress::AnyIPv4, 5555); // 绑定本地端口以便发送数据QByteArray message = "UDP Broadcast"; udpSocket.writeDatagram(message.data(), message.length(),QHostAddress::Broadcast, 5555);
接收UDP数据:
QUdpSocket receiver; receiver.bind(5555); // 绑定端口接收数据while (true) {QByteArray datagram;QHostAddress sender;quint16 senderPort;if (receiver.hasPendingDatagrams()) {datagram.resize(static_cast<int>(receiver.pendingDatagramSize()));receiver.readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);qDebug() << "Received UDP datagram from" << sender.toString() << ":" << senderPort << ", Data:" << datagram;} }
-
-
QNetworkAccessManager
QNetworkAccessManager
是用于执行高层网络操作的类,比如HTTP GET/POST请求、FTP上传下载等。
示例:QNetworkAccessManager manager; QNetworkRequest request(QUrl("http://example.com/api/data"));// 发送GET请求 QNetworkReply *reply = manager.get(request);connect(reply, &QNetworkReply::finished, [=](){if (reply->error() == QNetworkReply::NoError) {QByteArray response = reply->readAll();qDebug() << "GET Response: " << response;} else {qDebug() << "Error:" << reply->errorString();}reply->deleteLater(); });
其他辅助类:
QNetworkInterface
和QHostInfo
可以用于获取本地主机和远程主机的网络信息,例如IP地址、主机名等。
通过以上核心类,可以构建复杂的网络应用,包括但不限于聊天软件、文件传输系统、Web服务客户端等。