QT的TCP通讯

news/2025/1/22 23:30:46/

 

目录

一、引言

二、QT 中与 TCP 通讯相关的类

1.QTcpSocket 类

1.1 常用信号

1.2常用函数

2.QTcpServer类

2.1常用函数

三、QT TCP通信的详细代码实现

1.TCP服务器端实现

2.TCP客户端实现

四、总结


一、引言

在网络编程领域,TCP(Transmission Control Protocol,传输控制协议)是一种广泛应用的可靠传输协议。QT 作为一个强大的跨平台 C++ 应用程序开发框架,提供了丰富的类库来支持 TCP 通讯的开发。本文将详细介绍如何使用 QT 进行 TCP 通讯,包括客户端和服务器端的实现,希望能帮助大家快速上手相关开发。

二、QT 中与 TCP 通讯相关的类

QT 提供了丰富的类库来支持 TCP 通信的开发,其中最核心的两个类是 QTcpSocketQTcpServer

1.QTcpSocket 类

QTcpSocket类用于实现TCP客户端的功能。它提供了一系列的信号和槽函数,方便开发者处理网络连接、数据发送和接收等操作。

1.1 常用信号
  • connected():当客户端成功连接到服务器时触发该信号。
  • readyRead():当有数据可读时触发该信号,开发者可以在对应的槽函数中读取数据。
  • disconnected():当客户端与服务器断开连接时触发该信号。
1.2常用函数
  • connectToHost(const QString &hostName, quint16 port):用于连接到指定主机的指定端口。
  • write(const QByteArray &data):用于向服务器发送数据。
  • readAll():读取所有可用的数据,并以QByteArray的形式返回。

2.QTcpServer类

QTcpServer类用于创建TCP服务器,监听指定的端口,等待客户端的连接请求。

2.1常用函数
  • isten(const QHostAddress &address = QHostAddress::Any, quint16 port = 0):开始监听指定地址和端口。如果地址为QHostAddress::Any,则表示监听所有可用的网络接口。
  • incomingConnection(qintptr socketDescriptor):当有客户端连接请求时,该函数会被调用。开发者需要在该函数中创建一个QTcpSocket对象,并使用socketDescriptor来初始化它,从而实现与客户端的通信。

三、QT TCP通信的详细代码实现

1.TCP服务器端实现

下面是一个完整的TCP服务器端示例代码,详细展示了如何使用QTcpServer类来创建一个简单的服务器

#include <QTcpServer>
#include <QTcpSocket>
#include <QCoreApplication>
#include <QDebug>class MyTcpServer : public QTcpServer
{Q_OBJECTpublic:MyTcpServer(QObject *parent = nullptr) : QTcpServer(parent){if (this->listen(QHostAddress::Any, 1234)) {qDebug() << "Server started, listening on port 1234...";} else {qDebug() << "Server could not start!";}}protected:void incomingConnection(qintptr socketDescriptor) override{QTcpSocket *socket = new QTcpSocket(this);if (socket->setSocketDescriptor(socketDescriptor)) {connect(socket, SIGNAL(readyRead()), this, SLOT(handleReadyRead()));connect(socket, SIGNAL(disconnected()), this, SLOT(handleDisconnected()));qDebug() << "Client connected: " << socket->peerAddress().toString();} else {delete socket;}}private slots:void handleReadyRead(){QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());if (socket) {QByteArray data = socket->readAll();qDebug() << "Received data: " << data;// 这里可以进行数据处理,然后发送响应socket->write("Server received your message!");}}void handleDisconnected(){QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());if (socket) {qDebug() << "Client disconnected: " << socket->peerAddress().toString();socket->deleteLater();}}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);MyTcpServer server;return a.exec();
}

在上述代码中:

  1. MyTcpServer类:继承自QTcpServer类,在构造函数中调用listen函数开始监听端口1234。
  2. incomingConnection函数:当有客户端连接请求时,该函数被调用。它创建一个新的QTcpSocket对象,并将其与客户端的socketDescriptor关联起来。同时,连接该socket的readyRead和disconnected信号到相应的槽函数。
  3. handleReadyRead槽函数:当客户端有数据发送过来时,该函数被触发。它读取客户端发送的数据,并向客户端发送一个简单的响应。
  4. handleDisconnected槽函数:当客户端断开连接时,该函数被调用,用于清理资源。

2.TCP客户端实现

下面是一个完整的TCP客户端示例代码,展示了如何使用QTcpSocket类来连接到服务器并进行数据通信。

#include <QTcpSocket>
#include <QCoreApplication>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTcpSocket *socket = new QTcpSocket();socket->connectToHost("127.0.0.1", 1234);if (socket->waitForConnected(3000)) {qDebug() << "Connected to server!";socket->write("Hello, server!");if (socket->waitForReadyRead(3000)) {QByteArray data = socket->readAll();qDebug() << "Received response from server: " << data;} else {qDebug() << "Timeout waiting for response!";}socket->disconnectFromHost();if (socket->waitForDisconnected(3000)) {qDebug() << "Disconnected from server.";} else {qDebug() << "Failed to disconnect from server.";}} else {qDebug() << "Could not connect to server!";}delete socket;return a.exec();
}

在上述代码中:

  1. 创建QTcpSocket对象:并调用connectToHost函数尝试连接到本地主机的1234端口。
  2. waitForConnected函数:等待连接建立,超时时间为3秒。如果连接成功,打印连接成功的信息,并向服务器发送一条消息。
  3. waitForReadyRead函数:等待服务器响应,超时时间为3秒。如果收到响应,读取并打印服务器返回的数据。
  4. disconnectFromHost函数:断开与服务器的连接,并等待断开操作完成。

四、总结

通过以上示例,我们了解了如何使用 QT 进行 TCP 通讯的基本开发。在实际应用中,可能还需要考虑更多的因素,如错误处理、数据加密、多线程处理等。希望本文能为大家在 QT TCP 通讯开发方面提供一些帮助,后续可以进一步深入探索和实践。

 

 


http://www.ppmy.cn/news/1565332.html

相关文章

自动化爬虫运行过程中,有没有办法提高爬虫的抓取效率?

关于在实际爬虫开发及运行过程中,我们可以深刻研究爬虫机制和网站结构,如何提高爬虫抓取效率和性能是我们运行爬虫的关键所在。关于这一点,将从多个方面展开,包括并发处理、优化网络请求、缓存策略、代理IP池、分布式爬虫等,同时提供详细的代码实现和解释。 爬虫的抓取效…

微服务学习-Nacos 作为注册中心使用

Nacos 实现服务的注册与发现 1. 作用 服务的注册与发现 2. 为什么要引入注册中心 微服务中的订单服务调用商品、库存、账户等服务的 IP 地址和端口都是硬编码&#xff0c;会存在很多问题 如果商品、库存、账户等服务的 IP 地址或端口发生了变化&#xff0c;则订单服务将变得…

SpringBoot快速接入OpenAI大模型(JDK8)

使用AI4J快速接入OpenAI大模型 本博文给大家介绍一下如何使用AI4J快速接入OpenAI大模型&#xff0c;并且如何实现流式与非流式的输出&#xff0c;以及对函数调用的使用。 介绍 由于SpringAI需要使用JDK17和Spring Boot3&#xff0c;但是目前很多应用依旧使用的JDK8版本&…

32单片机从入门到精通之测试与验证——单元测试(十五)

人生苦短&#xff0c;我们都会面临困难和挑战。但是&#xff0c;只要我们保持积极的心态和勇往直前的精神&#xff0c;我们就能战胜一切困难&#xff0c;实现自己的目标。 成功并不是一蹴而就的&#xff0c;它需要我们付出努力和坚持不懈。就像爬山一样&#xff0c;我们可能会遇…

物联网技术正在如何影响我们的生活

物联网改变生活 引言 在今天这个数字化迅猛发展的时代&#xff0c;物联网&#xff08;IoT&#xff09;已经悄然渗透了我们生活的每一个角落。想象一下&#xff0c;当你的冰箱能够自动订购牛奶时&#xff0c;你是否会感到惊喜&#xff1f;这就是物联网的魔力&#xff0c;它不仅…

InVideo AI技术浅析(五):生成对抗网络

一、特效生成 1. 工作原理 特效生成是计算机视觉中的高级应用,旨在通过算法生成高质量的视觉特效,如风格迁移、图像到图像的翻译等。InVideo AI 使用生成对抗网络(GAN)来实现这一功能。GAN 通过生成器和判别器两个网络的对抗训练,生成逼真的视觉特效。 2. 关键技术模型…

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)

Profiles Profile 是一个以名称标识的集合&#xff0c;用于管理 密码 和 资源限制。 每个用户都对应一个profiles&#xff0c;可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…

Chapter 3-14. Detecting Congestion in Fibre Channel Fabrics

Port Monitor Policy Parameters Each policy contains one or more counters to monitor. Counters have the following parameters: 每个策略包含一个或多个要监控的计数器。计数器有以下参数: Counter name: The name of the counter which describes its function. 说明…