qt P2P网络通信(tcp、udp)

news2024/9/29 17:35:30

一、TCP

Qt中的TCP通信是基于Qt框架中的网络模块实现的,主要涉及到QTcpSocketQTcpServer两个类。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,适用于需要可靠传输的应用场景,如文件传输、网络数据库等。

Qt TCP通信的基本流程

在Qt中实现TCP通信,通常包括服务器端和客户端两部分。

服务器端
  1. 创建QTcpServer对象:用于监听来自客户端的连接请求。
  2. 绑定地址和端口:通过listen()方法绑定服务器监听的地址和端口。
  3. 处理连接请求:当监听到客户端的连接请求时,QTcpServer会发出newConnection()信号。在相应的槽函数中,可以使用nextPendingConnection()方法获取与客户端通信的QTcpSocket对象。
  4. 数据通信:通过QTcpSocket对象进行数据的发送和接收。使用write()方法发送数据,readAll()read()方法接收数据。
  5. 关闭连接:使用disconnectFromHost()方法关闭与客户端的连接。
客户端
  1. 创建QTcpSocket对象:用于与服务器建立连接。
  2. 连接到服务器:通过connectToHost()方法连接到服务器的指定地址和端口。
  3. 数据通信:与服务器端类似,使用write()方法发送数据,readAll()read()方法接收数据。
  4. 关闭连接:使用disconnectFromHost()方法关闭与服务器的连接。

二、UDP

在Qt中,UDP(用户数据报协议)通信主要通过QUdpSocket类来实现。UDP是一种无连接的网络协议,它提供了简单但不可靠的消息传输服务,适用于那些对实时性要求高但对数据可靠性要求不高的应用,如视频流、在线游戏等。以下是在Qt中使用UDP进行通信的基本步骤和要点:

1. 包含必要的头文件

在你的Qt项目中,确保包含了QUdpSocket类相关的头文件。

#include <QUdpSocket>

2. 创建QUdpSocket对象

通常在你的类的构造函数中创建QUdpSocket对象,或者在你准备开始通信的任何地方。

QUdpSocket *udpSocket = new QUdpSocket(this);

这里this指针指向当前类的实例,假设这个类继承自QObject

3. 绑定端口(服务器端)

在接收数据之前,你需要使用bind()函数将UDP套接字绑定到一个端口上。这告诉操作系统你希望在这个端口上监听传入的UDP数据报。

udpSocket->bind(QHostAddress::Any, 12345);

这里QHostAddress::Any表示监听所有可用的网络接口,12345是你要监听的端口号。

4. 接收数据

要接收数据,你需要将QUdpSocketreadyRead()信号连接到一个槽函数。当数据报到达时,这个信号会被触发,然后你的槽函数会被调用来处理这些数据。

connect(udpSocket, &QUdpSocket::readyRead, this, &MyClass::readPendingDatagrams);

在槽函数中,你可以使用readDatagram()函数来读取数据报。

void MyClass::readPendingDatagrams() {  
    while (udpSocket->hasPendingDatagrams()) {  
        QByteArray datagram;  
        datagram.resize(udpSocket->pendingDatagramSize());  
        QHostAddress sender;  
        quint16 senderPort;  
        udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);  
        // 处理接收到的数据  
        qDebug() << "Received datagram:" << QString::fromUtf8(datagram) << "from" << sender << "port" << senderPort;  
    }  
}

5. 发送数据

发送数据报使用writeDatagram()函数。你需要指定要发送的数据(QByteArray类型)、目标地址和端口。

QByteArray data = "Hello, UDP!";  
udpSocket->writeDatagram(data, QHostAddress("192.168.1.100"), 54321);

6. 注意事项

  • 当你接收到readyRead()信号时,应该读取传入的数据报,否则将不会为下一个数据报发出该信号。
  • UDP不提供可靠的数据传输,因此可能需要你自行实现一些错误检测和数据重传机制。
  • 如果你的应用需要处理多个客户端或需要更复杂的网络通信逻辑,请考虑使用多线程或Qt的网络框架(如QTcpServerQTcpSocket)来管理连接和数据传输。

DEMO下载:点击跳转

qq群交流:698593923

觉得有帮助的话,打赏一下呗。。

           

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

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

相关文章

【实战篇】join语句怎么优化?

背景 在上一篇文章中&#xff0c;我们介绍了 join 语句的两种算法&#xff0c;分别是 Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL)。 我们发现在使用 NLJ 算法的时候&#xff0c;其实效果还是不错的&#xff0c;比通过应用层拆分成多个语句然后再拼接查询结…

数字化转型的理论指南:推动企业变革的全面路径

企业数字化转型的战略框架 在当今全球化的数字经济中&#xff0c;企业数字化转型已成为组织发展的核心战略。无论是初创公司还是跨国企业&#xff0c;成功的数字化转型不仅依赖于新技术的应用&#xff0c;还要求从战略到运营的全方位调整。这种转型不仅包括引入先进的技术&…

一键去水印小程序源码系统 下载无水印的高清图片 带完整的安装代码包以及搭建部署教程

系统概述 一键去水印小程序源码系统是一款专为图片去水印设计的软件开发包&#xff08;SDK&#xff09;&#xff0c;它集成了先进的图像处理技术和智能识别算法&#xff0c;能够自动识别并去除图片中的水印&#xff0c;同时保持图片的高清画质不受损。该系统支持多种图片格式&…

树莓派4B配置教程 1

目录 树莓派初次入门 树莓派系统烧录 开启树莓派 为树莓派配置SSH和VNC远程服务 树莓派初次入门 笔者最近入门了树莓派4b&#xff0c;打算后续使用树莓派做点小东西玩玩。 新到手的树莓派&#xff0c;默认是一块白板&#xff0c;我们是需要使用到的有如下这些东西&#xf…

基于AWR1642 讲解TI毫米波雷达开发环境搭建

文章内容同步发布在公众号&#xff08;雷达原理与系统&#xff09;,欢迎关注交流~ 这是第三篇文章&#xff0c;上一篇文章介绍了“TI官方资源介绍和使用”&#xff0c;感兴趣的可以去参考一下。本篇内容打算介绍基于AWR1642讲解TI毫米波雷达开发环境搭建&#xff0c;包括常用的…

24 基于51单片机的公交车报站仿真(LCD12864、DS1302、串口)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DS1302时钟模块读取时间&#xff0c;通过LCD12864显示实时时间&#xff0c;然后两个按键&#xff0c;一个按下表示到站&#xff0c;一个按下表示没到站。 到达站点&a…

亚信安全天穹5分钟勒索体检 免费试用今起上线

对于勒索攻击的认知 你是否还停留在“2.0时代”&#xff1f; 勒索攻击无疑是企业面临的最大威胁&#xff0c;2024年上半年&#xff0c;勒索组织数量同步增长超过50%&#xff0c;勒索攻击数量也持续攀升&#xff0c;平均勒索赎金突破520万美元。 当前&#xff0c;勒索攻击治理…

Spring Boot 进阶- 如何从配置文件中获取值?

&emps;在上一篇文章中,我们介绍了两种配置文件的方式,那么在添加完配置文件之后,我们如何从配置文件中获取到对应配置的值呢?这篇文章中我们就来看看这个问题。 一般的说SpringBoot中读取配置文件的方式有两种 @Value注解:基于@Value注解进行配置,一般适用于单个属性…

工业狗转行AI的心路历程,重新来过为时不晚!

言归正传&#xff0c;原本想写一篇人工智能大模型的科普文&#xff0c;为以后整理学习笔记开个头&#xff0c;但是细细琢磨了一下我这半吊子水平&#xff0c;怕是说不齐全。而且&#xff0c;我一直以来都很想跟把自己跨专业/行业转行AI的心路历程跟别人分享一下&#xff0c;希望…

10.1 Linux_并发_进程基本知识

进程和程序的区别&#xff1a; 程序是存放在磁盘上的文件&#xff0c;是静态的。进程就是跑起来的程序&#xff0c;是动态的。它包括创建、调度、执行、消亡。是一个程序所分配资源的总称。 具体提关系如下&#xff1a; 各部分具体含义参考博文"16.C基础_内存管理"…

双token无感刷新(vue3+node.js)

无感刷新的基本原理 使用刷新令牌&#xff08;refresh token&#xff09;&#xff1a; ○ 应用程序在首次登录成功后会获得一个访问令牌&#xff08;access token&#xff09;和一个刷新令牌&#xff08;refresh token&#xff09;。 ○ 访问令牌通常有较短的有效期&#xff0…

2024史上最全网络安全面试题+答案,看完offe拿到手软!

1.1 网络安全行业现状 安全行业起步晚。安全行业整体起来才没几年&#xff0c;多数企业因为资源投入和建设时间原因导致覆盖面和深入度都不够&#xff0c;这其中甚至包括一些国内大厂&#xff0c;并没有想象的那么安全。其安全水位仅能应付一些白帽子级别&#xff0c;针对专业…

产品经理有必要学习大模型技术吗???

产品经理要讨论的&#xff0c;不是有没有必要学习大模型&#xff0c;而是以怎样的姿势拥抱大模型。 我之前公司是外企&#xff0c;还记得当年Iphone刚推出的时候&#xff0c;我的一个同事从东北老家拿着一个U盘跑到北京&#xff0c;跟我们公司部门主管描绘了他设想中PC端产品迁…

终于不用为GPU算力发愁了,FLUX LoRA训练一键启动!(附模型)

FLUX 是一个开源的全新的图像生成器&#xff0c;可以生成逼真的超现实图像&#xff0c;人们称它为 Midjourney 的终结者&#xff0c;下一代 Stable Diffusion 的替代品。 FLUX究竟强大到什么程度&#xff1f;外网到现在为止&#xff0c;都还有抵制它的声音。 Google DeepMind 团…

excel快速入门(二)

Excel的概念说明 文章目录 Excel的概念说明常见术语说明单元格/单元格区域活动单元格/单元格区域行或列单元格引用相对引用绝对引用混合引用 Excel的常见格式说明单元格格式数字格式 Excel 工作表编辑鼠标指针介绍1.白色十字状2.单向黑色箭头状3.双向单竖线箭头状4.双向双竖线箭…

Dubbo框架面试题

1.什么是Dubbo? Dubbo是基于Java的高性能轻量级的RPC分布式服务框架&#xff0c;现已成为 Apache 基金会孵化项目。 2.为什么要使用Dubbo? 随着互联网的快速发展&#xff0c;Web应用程序的规模不断扩大&#xff0c;分布式服务体系结构和流计算体系结构势在必行。 dubbo的…

对博客系统进行自动化测试

博客系统代码&#xff1a;spring-blog taotao/Studying JavaEE Advanced - 码云 - 开源中国 (gitee.com) 自动化脚本代码&#xff1a;BlogAutoTest taotao/Studying JavaEE Advanced - 码云 - 开源中国 (gitee.com) 上线项目地址&#xff1a;博客登陆页 目录 一、博客系统项…

【Spring】lombok、dbUtil插件应用

一、lombok插件 1. 功能&#xff1a;对实体类自动&#xff0c;动态生成get、set方法&#xff0c;无参、有参构造..... 2. 步骤&#xff1a; &#xff08;1&#xff09;idea安装插件(只做一次) &#xff08;2&#xff09;添加坐标 &#xff08;3&#xff09;编写注解 NoArgsCo…

Python面向对象编程:类和对象①

文章目录 一、什么是面向对象编程1.1 面向对象编程的基本概念1.2 Python中的类和对象 二、定义类和创建对象2.1 定义类2.2 创建对象2.3 __init__方法2.4 self参数 三、类的属性和方法3.1 类的属性3.1.1 实例属性3.1.2 类属性 3.2 类的方法3.2.1 实例方法3.2.2 类方法3.2.3 静态…

Redis缓存技术 基础第二篇(Redis的Java客户端)

文章目录 一、Redis的Java客户端二、Jedis快速入门三、Jedis连接池四、SpringDataRedis快速入门五、SpringDataRedis优化 一、Redis的Java客户端 在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/clients 而关于java的功能模块分为以下几种…