记录一些Qt基础方法,大佬忽略。。。
首先客户端与服务端都需要在pro加入
QT += network
服务端包含头文件
#include <QTcpServer>
客户端包含头文件
#include <QTcpSocket>
服务端Server代码如下:
#include <QCoreApplication>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDebug>
class Server : public QTcpServer {
public:
explicit Server(QObject *parent = nullptr);
protected:
void incomingConnection(qintptr socketDescriptor) override;
private slots:
void processRequest();
void disconnectClient();
};
#include "Server.h"
#include <QDebug>
Server::Server(QObject *parent) : QTcpServer (parent)
{
}
void Server::processRequest()
{
QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
if (!socket) {
return;
}
QByteArray requestData = socket->readAll();
qDebug() << "Received request from client" << socket->socketDescriptor() << ":" << requestData;
QByteArray responseData = "收到";
socket->write(responseData);
socket->waitForBytesWritten();
qDebug() << "Sent response to client" << socket->socketDescriptor() << ":" << responseData;
}
void Server::disconnectClient()
{
QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
if (!socket) {
return;
}
qDebug() << "Client disconnected:" << socket->socketDescriptor();
socket->deleteLater();
}
void Server::incomingConnection(qintptr socketDescriptor)
{
QTcpSocket *socket = new QTcpSocket(this);
if (socket->setSocketDescriptor(socketDescriptor)) {
connect(socket, &QTcpSocket::readyRead, this, &Server::processRequest);
connect(socket, &QTcpSocket::disconnected, this, &Server::disconnectClient);
qDebug() << "New client connected:" << socketDescriptor;
} else {
qWarning() << "Failed to set socket descriptor";
delete socket;
}
}
客户端Client请求函数代码如下:
//包含头文件
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QDebug>
#include <QTimer>
#include <QTcpSocket>
#include <QTcpServer>
//发送方法
void Client::send()
{
QTcpSocket* socket = new QTcpSocket(this);
socket->connectToHost(QHostAddress::LocalHost, 1234);
QString request = "发出请求";
qint64 bytesWritten = socket->write(request.toUtf8() );
if (bytesWritten == -1) {
qWarning() << "Failed to send request";
}
if (!socket->waitForBytesWritten(500)) { // 等待数据发送完毕
qWarning() << "Failed to send all data"<<socket->errorString();
}
QByteArray responseData;
while (socket->waitForReadyRead(500)) { // 循环等待响应数据
responseData += socket->readAll();
qDebug()<<"客户端处理数据中"<<endl;
}
qDebug() << "Received response:" << responseData;
socket->disconnectFromHost(); // 断开连接
}
以下为客户端调用天气查询API进行查询和打印结果的示例:
QNetworkAccessManager manager;
QUrl url("http://api.openweathermap.org/data/2.5/weather?q=NanJing&appid=***");
QNetworkRequest request(url);
// 发送 GET 请求并获取响应
QNetworkReply *reply = manager.get(request);
// 连接信号 finished,当请求完成时处理响应数据
QObject::connect(reply, &QNetworkReply::finished, [&]() {
// 检查响应是否出错
if (reply->error() != QNetworkReply::NoError) {
qDebug() << "请求发生错误:" << reply->errorString();
} else {
// 处理响应数据
QString response = QString(reply->readAll());
qDebug() << "查询结果:" << response;
}
// 释放 QNetworkReply 对象内存
reply->deleteLater();
// 退出事件循环
});