当前位置: 首页 > news >正文

【Qt笔记】Qt建立UDP通信

目录

一、前言

二、服务端

①在项目配置文件中加入network模板

②创立一个继承自QObject的UdpServer的类

③构造函数的实现

④读取信息函数的实现

三、客户端

①绑定服务端的IP地址和端口号

②发送数据报给服务端

四、实现效果


一、前言

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的、面向报文的、基于网络的传输层协议。

二、服务端

①在项目配置文件中加入network模板

QT       += core gui network

②创立一个继承自QObject的UdpServer的类

UdpServer构造函数用于创建对象时初始化对象

readDatagram函数用于读取客户端发来的信息,并进行相应的操作

#include <QUdpSocket>  
#include <QDebug>  
#include <QBuffer>  
#include <QDataStream>  class UdpServer : public QObject  
{  Q_OBJECT  
public:  //构造函数UdpServer(QObject *parent = nullptr);private slots:  //读取客户端发来的信息函数void readDatagram();  private:  //udp通信的变量QUdpSocket *udpSocket;  
};

③构造函数的实现

bind函数绑定到所有可用的网络接口上的12345端口,其中的QHostAddress::Any参数是所有可用的网络接口,你也可以给具体的IP地址
connect函数是用于连接信号与槽,确保接收到UDP数据报时能够自动调用readDatagram函数

UdpServer::UdpServer(QObject *parent = nullptr)  : QObject(parent), udpSocket(new QUdpSocket(this))  
{  udpSocket->bind(QHostAddress::Any, 12345);  //绑定到所有可用的网络接口上的12345端口connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::readDatagram);  //连接信号与槽,确保接收到UDP数据报时能够自动调用readDatagram函数
}

④读取信息函数的实现

使用while循环读取数据报,通过调用hasPendingDatagrams()的方法实现

当有数据报时,声明了一个 QByteArray类型的变量 datagram,用于存储从 UDP 套接字接收到的数据。

调用pendingDatagramSize()方法获取当前待处理数据报的大小

声明了QHostAddress类型的变量senderquint16类型的变量senderPort,它们将用于存储发送数据报的计算机的 IP 地址和端口号

调用readDatagram()方法从udpSocket读取数据报,如果读取失败(例如,套接字关闭或发生错误),它将返回-1

truncate()方法调整datagram的大小以匹配实际读取的字节数

void UdpServer::readDatagram()
{  while (udpSocket->hasPendingDatagrams()) {  QByteArray datagram;  datagram.resize(int(udpSocket->pendingDatagramSize()));  QHostAddress sender;  quint16 senderPort;  int bytesRead = udpSocket->readDatagram(datagram.data(), datagram.size(),  &sender, &senderPort);  if (bytesRead == -1) {  qDebug() << "Failed to read datagram";  continue;  }  datagram.truncate(bytesRead);  // 假设我们发送的是简单的字符串命令,如"pressKeyA"  QString command(datagram);  qDebug() << "Received command:" << command << "from" << sender.toString() << ":" << senderPort;  }  
}

三、客户端

①绑定服务端的IP地址和端口号

这里服务端的IP地址使用的是本机地址,端口号是前面服务端设置的端口号

QString serverIp = "192.168.1.100"; // 服务端IP地址  
quint16 serverPort = 12345;         // 服务端端口号  

②发送数据报给服务端

message为发送的数据,本文只是举例子,因此只发送了一次,你可以通过循环结构发送或者通过Qt按钮点击发送

QByteArray message = "Hello, Server!";
sendUdpMessage(serverIp, serverPort, message);

四、实现效果

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 面试题:Rabbitmq怎么保证消息的可靠性?
  • 电脑桌面管理如何做?2024电脑桌面终极管理方法分享
  • 【安全靶场】-DC-5
  • 『基础』OS-1计算机系统概述_操作系统发展历程及它的运行环境
  • 机器人蓝牙通信绕坑
  • 【pip镜像设置】pip使用清华镜像源安装
  • <数据集>无人机航拍不同高度牧羊识别数据集<目标检测>
  • day06_算法训练
  • 星露谷模组开发教程#6 烹饪和制造配方
  • 免费高画质提取PPT/Word/Excel中的图片工具
  • 华为OD题目 csv格式的数据 字符串 用C没写出来
  • OS-Copilot:自学习的通用计算机智能体
  • day 10 贪心算法
  • 优化 WinForms 应用程序的 DataGridView 性能
  • 【三维重建】2D Gaussian Splatting:几何准确的2D辐射场(更新中)
  • C# 免费离线人脸识别 2.0 Demo
  • Facebook AccountKit 接入的坑点
  • JavaWeb(学习笔记二)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Redux系列x:源码分析
  • springMvc学习笔记(2)
  • vue2.0项目引入element-ui
  • 从零开始在ubuntu上搭建node开发环境
  • 浮现式设计
  • 解析带emoji和链接的聊天系统消息
  • 面试总结JavaScript篇
  •  一套莫尔斯电报听写、翻译系统
  • 异常机制详解
  • 译米田引理
  • 用jQuery怎么做到前后端分离
  • gunicorn工作原理
  • 从如何停掉 Promise 链说起
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 说说我为什么看好Spring Cloud Alibaba
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #include
  • #VERDI# 关于如何查看FSM状态机的方法
  • #Z0458. 树的中心2
  • (007)XHTML文档之标题——h1~h6
  • (33)STM32——485实验笔记
  • (LeetCode) T14. Longest Common Prefix
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (黑马点评)二、短信登录功能实现
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三)docker:Dockerfile构建容器运行jar包
  • (三分钟)速览传统边缘检测算子
  • (四)JPA - JQPL 实现增删改查
  • (五)activiti-modeler 编辑器初步优化
  • (原創) 物件導向與老子思想 (OO)
  • (转)一些感悟