Qt/QtCreator:QTcpSocket与QTcpServer用法

记录一些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();
           // 退出事件循环
       });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值