基于Qt实现TCP和UDP客户端与服务端的完整指南

在当今的软件开发领域,网络通信已经成为了不可或缺的一部分。无论是在物联网(IoT)、企业级应用还是简单的客户端与服务端通信场景中,有效且高效的数据传输都是至关重要的。Qt,作为一个跨平台的C++框架,不仅提供了丰富的用户界面组件,还提供了一套完整的网络模块,使得开发者能够轻松地实现TCP和UDP通信。本文将指导你如何使用Qt来创建TCP和UDP的客户端与服务端,并提供相应的代码示例。

TCP客户端与服务端

TCP服务端

要创建一个TCP服务端,我们首先需要使用QTcpServer类。这个类可以让我们监听来自客户端的连接请求。以下是一个简单的TCP服务端实现:

#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>class TcpServer : public QObject
{Q_OBJECT
public:explicit TcpServer(QObject *parent = nullptr);void startServer(int port){if (!server.listen(QHostAddress::Any, port)) {qDebug() << "Server could not start!";} else {qDebug() << "Server started!";}}private slots:void newConnection(){QTcpSocket *socket = server.nextPendingConnection();socket->write("Hello from TCP Server!");socket->flush();socket->waitForBytesWritten(3000);socket->close();}private:QTcpServer server;void setupSignals(){connect(&server, &QTcpServer::newConnection, this, &TcpServer::newConnection);}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);TcpServer server;server.startServer(1234);return a.exec();
}

在这个例子中,我们创建了一个TcpServer类,它在构造函数中通过调用setupSignals方法连接了新连接信号newConnection到自定义的槽函数。当有新的客户端连接时,newConnection槽函数会被调用,接着我们通过nextPendingConnection获取与客户端通信的QTcpSocket对象,并向客户端发送一条消息。

TCP客户端

对于TCP客户端,我们将使用QTcpSocket类。以下是TCP客户端的基本实现:

#include <QTcpSocket>
#include <QDebug>class TcpClient : public QObject
{Q_OBJECT
public:explicit TcpClient(QObject *parent = nullptr){connect(&socket, &QTcpSocket::connected, this, &TcpClient::connected);connect(&socket, &QTcpSocket::disconnected, this, &TcpClient::disconnected);connect(&socket, &QTcpSocket::readyRead, this, &TcpClient::readyRead);}void connectToServer(const QString &host, int port){socket.connectToHost(host, port);}private slots:void connected(){qDebug() << "Connected to server!";socket.write("Hello from TCP Client!");}void disconnected(){qDebug() << "Disconnected from server!";}void readyRead(){qDebug() << "Server says:" << socket.readAll();}private:QTcpSocket socket;
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);TcpClient client;client.connectToServer("127.0.0.1", 1234);return a.exec();
}

在这个TCP客户端的实现中,我们首先建立了与服务器的连接,然后在连接成功后发送一条消息给服务器。通过连接QTcpSocket的信号到自定义槽函数,我们能够处理连接、断开连接以及读取服务器发来的数据。

UDP客户端与服务端

与TCP不同,UDP是一种无连接的协议,通常用于那些对实时性要求较高的场景。

UDP服务端

创建UDP服务端,我们将使用QUdpSocket类。以下是UDP服务端的基本实现:

#include <QUdpSocket>
#include <QDebug>class UdpServer : public QObject
{Q_OBJECT
public:explicit UdpServer(QObject *parent = nullptr){socket.bind(QHostAddress::Any, 1234);connect(&socket, &QUdpSocket::readyRead, this, &UdpServer::readyRead);}private slots:void readyRead(){QByteArray buffer;buffer.resize(socket.pendingDatagramSize());QHostAddress sender;quint16 senderPort;socket.readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);qDebug() << "Received from" << sender.toString() << ":" << senderPort << "->" << buffer;QString response = "Hello from UDP Server!";socket.writeDatagram(response.toUtf8(), sender, senderPort);}private:QUdpSocket socket;
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);UdpServer server;return a.exec();
}

在这个例子中,我们通过调用bind方法使QUdpSocket监听指定的端口。当有数据到达时,readyRead信号被触发,我们的readyRead槽函数就会被执行。在这个函数中,我们读取并处理来自客户端的数据,然后回复一条消息。

UDP客户端

UDP客户端的实现也是通过QUdpSocket类。以下是一个简单的UDP客户端实现:

#include <QUdpSocket>
#include <QDebug>class UdpClient : public QObject
{Q_OBJECT
public:explicit UdpClient(QObject *parent = nullptr){connect(&socket, &QUdpSocket::readyRead, this, &UdpClient::readyRead);}void sendMessage(const QString &message, const QString &host, quint16 port){socket.writeDatagram(message.toUtf8(), QHostAddress(host), port);}private slots:void readyRead(){QByteArray buffer;buffer.resize(socket.pendingDatagramSize());socket.readDatagram(buffer.data(), buffer.size());qDebug() << "Server says:" << buffer;}private:QUdpSocket socket;
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);UdpClient client;client.sendMessage("Hello from UDP Client!", "127.0.0.1", 1234);return a.exec();
}

在UDP客户端的实现中,我们通过writeDatagram方法向服务器发送一条消息。当服务器回复时,readyRead信号被触发,我们的readyRead槽函数将处理服务器发来的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K线实战分析系列之十一:行情力量不足——平头形态

K线实战分析系列之十一&#xff1a;行情力量不足——平头形态 一、平头形态二、不同形态与平头形态的叠加三、总结平头形态 一、平头形态 前一根K线具有较长的实体&#xff0c;后一根K线的实体比较小&#xff0c;无论是多头还是空头的力量到第二根K线都被瓦解了多头上攻&#…

【数据结构与算法】(21)高级数据结构与算法设计之 Dynamic-Programming 动态规划算法 代码示例与详细讲解

目录 4.3 Dynamic-Programming1) Fibonacci降维 2) 最短路径 - Bellman-Ford3) 不同路径-Leetcode 62降维 4) 0-1 背包问题降维 5) 完全背包问题降维 6) 零钱兑换问题-Leetcode322降维零钱兑换 II-Leetcode 518 7) 钢条切割问题降维类似题目 Leetcode-343 整数拆分 8) 最长公共…

HashMap学习

hashmap 1、hashmap 与 hashtable 的区别2、hashmap基本类型与包装类常用实现变量介绍初始容量和负载因子红黑树和链表转化HashMap的内部数据结构HashMap内部哈希算法 参考文章 1、hashmap 与 hashtable 的区别 线程安全null值执行效率 2、hashmap hashmap是java中常用的集合…

寻找连续区间(C 语言)【数组区间处理】

题目来自于博主算法大师的专栏&#xff1a;最新华为OD机试C卷AB卷OJ&#xff08;CJavaJSPy&#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html 题目 给定一个含有 N 个正整数的数组&#xff0c; 求出有多少个连续区间&#xff08;包括单个正整数&am…

python 基础知识点(蓝桥杯python科目个人复习计划51)

今日复习计划&#xff1a;做复习题 例题1&#xff1a;大石头的搬运工 问题描述&#xff1a; 在一款名为“大石头的搬运工”的游戏中&#xff0c;玩家需要 操作一排n堆石头&#xff0c;进行n - 1轮游戏。 每一轮&#xff0c;玩家可以选择一堆石头&#xff0c;并将其移动到任…

【生活】浅浅记录

各位小伙伴们好鸭&#xff0c;今天不是技术文章&#xff0c;浅浅记录一下最近几个月的收获&#x1f60a; 新的一年&#xff0c;一起努力&#xff0c;加油加油&#xff01;

分库分表(以MySQL为例说明)

1、为什么要分库&#xff1f; ①减轻磁盘压力 ②单库并发连接请求数有限&#xff0c;如果存在过多连接会出现too many connections的问题 2、为什么要分表&#xff1f; ①一般单表数据量超千万很大了&#xff0c;单表数据量过大会出现性能瓶颈&#xff0c;建索引、SQL优化、数据…

tinymce问题处理

Vite构建工具下Tinymce踩坑指南 解决方案是在路劲前面增加/&#xff0c;这个跟上面链接有些区别&#xff0c;区别原因应该是如果路由采用的是createWebHashHistory则应该去掉/&#xff0c;如果是createWebHistory则应该加上/ 页面引用,一种异步加载&#xff0c;一种同步加载&…

深度学习的启航:从零到一的完全指南

深度学习的启航&#xff1a;从零到一的完全指南 深度学习近年来已成为人工智能领域最耀眼的明星&#xff0c;其在图像识别、自然语言处理、游戏以及无人驾驶等领域取得的进展令人瞩目。如果你对深度学习充满好奇&#xff0c;想要开启一段全新的学习旅程&#xff0c;这篇文章将…

睿易售前初级认证课程R1.0睿网络命名选型-2023练习题答案

1、RG-RAP6260(G)可以用在什么场景下?【多选题】 A、别墅花园 B、冷库 C、大型仓库 D、海边 A B C D 2、AP选型要关注什么?【多选题】 A、使用场景 B、带机量 C、Wi-Fi5还是Wi-Fi6 D、千兆还是百兆 A B C D 3、带机60终端以上的Wi-Fi6千兆吸顶AP选哪款【多选题】 A、…

LeetCode 热题 100 | 二叉树(二)

目录 1 543. 二叉树的直径 2 102. 二叉树的层序遍历 3 108. 将有序数组转换为二叉搜索树 菜鸟做题&#xff0c;语言是 C 1 543. 二叉树的直径 这道题和 124. 二叉树中的最大路径和 太像了 题眼&#xff1a;二叉树的 直径 是指树中任意两个节点之间 最长路径的长度 。…

JS基础(三)-操作和流程控制

一 操作网页元素的步骤 1. 查找网页元素 给标签设置id属性&#xff0c;一个网页中的id值不允许重复 <button id"btn">按钮</button> 2. 给按钮绑定事件&#xff0c;监听用户操作 btn.onclick function(){ 一旦监听到用户的…

人工智能 — 特征选择、特征提取、PCA

目录 一、特征选择1、定义2、原因3、做法4、生成过程5、停止条件 二、特征提取三、PCA 算法1、零均值化&#xff08;中心化&#xff09;2、方差3、协方差4、协方差矩阵5、对协方差矩阵求特征值、特征矩阵6、对特征值进行排序7、评价模型8、代码实现9、sklearn 库10、鸢尾花实例…

【数据结构与算法(Java版)】深度剖析二分查找算法

【二分查找算法】的时间复杂度为O(log n)&#xff0c;其中n为数组的长度。因为每次查找都将查找范围缩小一半&#xff0c;所以算法的时间复杂度是对数级别的。 目录 前言 二分查找算法是什么&#xff1f; 算法实现 方式一&#xff1a;&#xff08;左闭右闭&#xff09; 文…

电机控制常见的外围器件

小型断路器&#xff1a; 这些通通都叫小型断路器&#xff0c;二十年的老电工不一定都认识&#xff0c;不信看看_哔哩哔哩_bilibili 1PIN 2PIN 3PIN 4PIN: 正常情况下火线和零线的电流是相等的&#xff0c;但是漏电的情况下&#xff0c;两线的电流差值大于30毫安&#xff0c;漏…

合纵连横 – 以 Flink 和 Amazon MSK 构建 Amazon DocumentDB 之间的实时数据同步

在大数据时代&#xff0c;实时数据同步已经有很多地方应用&#xff0c;包括从在线数据库构建实时数据仓库&#xff0c;跨区域数据复制。行业落地场景众多&#xff0c;例如&#xff0c;电商 GMV 数据实时统计&#xff0c;用户行为分析&#xff0c;广告投放效果实时追踪&#xff…

笔记本hp6930p安装Android-x86避坑日记

一、序言 农历癸卯年前大扫除&#xff0c;翻出老机hp6930p&#xff0c;闲来无事&#xff0c;便安装Android-x86玩玩&#xff0c;期间多次入坑&#xff0c;随手记之以避坑。 笔记本配置&#xff1a;T9600,4G内存&#xff0c;120G固态160G机械硬盘 二、Android-x86系统简介 官…

2023最新盲盒交友脱单系统源码

源码获取方式 搜一搜&#xff1a;万能工具箱合集 点击资源库直接进去获取源码即可 如果没看到就是待更新&#xff0c;会陆续更新上 或 源码软件库 最新盲盒交友脱单系统源码&#xff0c;纸条广场&#xff0c;单独抽取/连抽/同城抽取/高质量盒子 新增功能包括心动推荐&#xff…

js使用new Image()创建img对象不生效

我在做vue项目的时候&#xff0c;想获取到图片的宽高&#xff0c;然后把宽高发给后端&#xff0c;代码类似是这样的 function getFileData(file: File) {return new Promise(function (resolve, reject) {let reader new FileReader();reader.readAsDataURL(file);reader.onlo…

备考2024年高考全国甲卷文科数学:历年选择题真题练一练

距离2024年高考还有三个多月的时间&#xff0c;最后这个时间&#xff0c;同学们基本上是以刷题为主。刷题的时候最重要的是把往年的真题吃透&#xff0c;因为真题是严格按照考纲出的&#xff0c;掌握了真题后面的知识点&#xff0c;并能举一反三地运用&#xff0c;那么高考的高…