Qt:实现TCP同步与异步读写消息

devtools/2024/11/14 3:18:08/

一、异步读写

在 Qt 中实现 TCP 客户端和服务器的同步和异步读写消息涉及使用 QTcpSocketQTcpServer 类。这两个类提供了用于建立 TCP 连接、发送和接收数据的功能。下面是一个简单的示例,演示了如何在 Qt 中实现 TCP 客户端和服务器的同步和异步读写消息:

TCP 服务器端示例(异步)

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTcpServer server;server.listen(QHostAddress::Any, 1234); // 监听端口 1234QObject::connect(&server, &QTcpServer::newConnection, [&](){QTcpSocket* clientSocket = server.nextPendingConnection();QObject::connect(clientSocket, &QTcpSocket::readyRead, [&](){QByteArray requestData = clientSocket->readAll();qDebug() << "Received request from client:" << requestData;// Echo back the received dataclientSocket->write(requestData);});});qDebug() << "TCP server started. Listening on port 1234...";return a.exec();
}

TCP 客户端端示例(异步)

#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTcpSocket client;client.connectToHost("127.0.0.1", 1234); // 连接到服务器的 IP 地址和端口QObject::connect(&client, &QTcpSocket::connected, [&](){qDebug() << "Connected to server.";// Send a message to the serverclient.write("Hello, Server!");});QObject::connect(&client, &QTcpSocket::readyRead, [&](){QByteArray responseData = client.readAll();qDebug() << "Received response from server:" << responseData;});return a.exec();
}

示例简单演示了如何在 Qt 中实现 TCP 客户端和服务器的异步读写消息。在异步通信中,使用信号和槽机制来处理数据的接收和发送。

二、同步读写

以下是一个简单的示例,演示了如何在 Qt 中实现 TCP 客户端和服务器的同步读写消息:

TCP 服务器端示例(同步)

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTcpServer server;server.listen(QHostAddress::Any, 1234); // 监听端口 1234if (!server.isListening()) {qDebug() << "Failed to start TCP server.";return 1;}QTcpSocket* clientSocket = nullptr;while (true) {if (server.hasPendingConnections()) {clientSocket = server.nextPendingConnection();break;}}if (clientSocket) {qDebug() << "Client connected.";// Read data from clientQByteArray requestData = clientSocket->readAll();qDebug() << "Received request from client:" << requestData;// Echo back the received dataclientSocket->write(requestData);}return a.exec();
}

TCP 客户端端示例(同步)

#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTcpSocket client;client.connectToHost("127.0.0.1", 1234); // 连接到服务器的 IP 地址和端口if (!client.waitForConnected()) {qDebug() << "Failed to connect to server.";return 1;}qDebug() << "Connected to server.";// Send a message to the serverclient.write("Hello, Server!");if (!client.waitForBytesWritten()) {qDebug() << "Failed to write data to server.";return 1;}if (!client.waitForReadyRead()) {qDebug() << "Failed to read response from server.";return 1;}// Read response from serverQByteArray responseData = client.readAll();qDebug() << "Received response from server:" << responseData;return a.exec();
}

示例简单演示了如何在 Qt 中实现 TCP 客户端和服务器的同步读写消息。在同步通信中,使用 waitForConnectedwaitForBytesWrittenwaitForReadyRead 等方法来等待连接建立、数据写入和数据读取完成。这种方式适用于需要确保数据传输完整性和顺序性的场景。


http://www.ppmy.cn/devtools/19872.html

相关文章

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(二)、需求分析和系统设计

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 说明&#xff1a;本次实验的代码使用verilog编写&#xff0c;文章中为阅读方便&#xff0c…

软件测试报告的用途

软件测试报告的用途十分广泛&#xff0c;主要体现在以下几个方面&#xff1a; 评估软件质量&#xff1a;软件测试报告是对软件进行全面、系统测试后的总结&#xff0c;通过报告中的各项数据和结果&#xff0c;可以评估软件的质量水平&#xff0c;包括功能的完整性、性能的稳定…

Swift-27-类的初始化与销毁

Swift的初始化是一个有大量规则的固定过程。初始化是设置类型实例的操作&#xff0c;包括给每个存储属性初始值&#xff0c;以及一些其他准备工作。完成这个过程后&#xff0c;实例就可以使用了。 简单来讲就是类的构造函数&#xff0c;基本语法如下&#xff1a; 注意&#xff…

个人开发 App 最简单方法:使用现代开发工具和平台

在移动应用市场的蓬勃发展下&#xff0c;个人开发者也有机会将自己的创意转化为实际的应用程序&#xff0c;并通过应用商店实现盈利。然而&#xff0c;对于许多初学者来说&#xff0c;如何开始个人开发一个应用可能会感到困惑。本文将介绍个人开发 App 的最简单方法&#xff0c…

【MySQL】select查询

1. 基本的SELECT语句 1.1 SELECT ... FROM SELECT 标识选择哪些列FROM 标识从哪个表中选择例&#xff1a;SELECT * FROM student; #使用通配符&#xff0c;*表示返回所有的列例&#xff1a;SELECT id,name,guardian_phone FROM student; #具体行和列 1.2 列的别名 …

python3爬虫笔记2

1 urlpare模块 urlparse模块主要用于处理URL字符串&#xff0c;它的核心功能是将URL拆分为多个组成部分&#xff0c;并允许你通过名字属性或索引来访问这些部分。通过调用urlparse模块的相关函数&#xff0c;你可以轻松解析URL&#xff0c;获取其不同组件的信息&#xff0c;如…

安装docker后部署一个redis服务

安装 Docker 后&#xff0c;您可以使用 Docker Hub 上提供的 Redis 镜像轻松部署 Redis 服务。以下是在 Docker 中部署 Redis 服务的步骤&#xff1a; 1. 拉取 Redis 镜像&#xff1a; 使用以下命令从 Docker Hub 拉取 Redis 镜像&#xff1a; docker pull redis2. 运行 Red…

MATLAB矩阵

MATLAB 矩阵 矩阵是数字的二维数组。 在MATLAB中&#xff0c;您可以通过在每行中以逗号或空格分隔的数字输入元素并使用分号标记每行的结尾来创建矩阵。 例如&#xff0c;让我们创建一个45矩阵一- 示例 a [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8] MATLAB将执行上述语…