Qt中UDP通信的简单示例

udp通信分为发送端和接收端,通信步骤可以分为以下:

接收端:
  1. 创建QUdpSocket对象。在.h文件中添加类的前置声明,定义该类的指针,在.cpp的构造函数中定义指向该类的指针。
  2. bind()。绑定IP和端口。
  3. connect()。绑定readyRead()信号,当有数据到来的时候,触发这个信号,在对应的槽函数中处理数据,读数据调用readDatagram()函数,在第三,四个参数可以保存发送端的IP和端口。
发送端:

1.创建QUdpSocket对象。在.h文件中添加类的前置声明,定义该类的指针,在.cpp的构造函数中定义指向该类的指针。
2.发送数据。调用writeDatagram()函数发送数据到指定的IP和端口。
下面是界面效果:
在这里插入图片描述
在这里插入图片描述
发送端的代码:
Send.h

#ifndef SEND_H
#define SEND_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui { class Send; }
QT_END_NAMESPACEclass QUdpSocket;class Send : public QDialog
{Q_OBJECTpublic:Send(QWidget *parent = nullptr);~Send();private slots:void on_textEdit_cursorPositionChanged();void on_sendButton_clicked();private:Ui::Send *ui;QUdpSocket *sender;
};
#endif // DIALOG_H

Send.cpp

#include "Send.h"
#include "ui_Send.h"
#include <QtNetwork>
#include <QDebug>Send::Send(QWidget *parent): QDialog(parent), ui(new Ui::Send)
{ui->setupUi(this);setWindowTitle(tr("发送端"));sender = new QUdpSocket(this);ui->sendButton->setEnabled(false);
}Send::~Send()
{delete ui;
}void Send::on_textEdit_cursorPositionChanged()
{if(!ui->textEdit->toPlainText().isEmpty()){ui->sendButton->setEnabled(true);}
}void Send::on_sendButton_clicked()
{QByteArray text = ui->textEdit->toPlainText().toUtf8();//每次只发送输入的哪些文字,不会追加qint64 bytes = sender->writeDatagram(text,text.size(),QHostAddress::LocalHost,7777);if(bytes == -1){qDebug()<<"发送数据失败!";return ;}
}

接收端的代码:
Receive.h

#ifndef RECEIVE_H
#define RECEIVE_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui { class Receive; }
QT_END_NAMESPACEclass QUdpSocket;
class QTimer;class Receive : public QDialog
{Q_OBJECTpublic:Receive(QWidget *parent = nullptr);~Receive();
private slots:void slot_readyRead();void slot_error();void slot_timeout();
private:Ui::Receive *ui;QUdpSocket *receiver;QTimer *timer;
};
#endif // RECEIVE_H

Receive.cpp

#include "receive.h"
#include "ui_receive.h"
#include <QtNetwork>
#include <QDebug>
#include <QTimer>Receive::Receive(QWidget *parent): QDialog(parent), ui(new Ui::Receive)
{ui->setupUi(this);setWindowTitle(tr("接收端"));receiver = new QUdpSocket(this);receiver->bind(QHostAddress("127.0.0.1"),7777);connect(receiver,&QUdpSocket::readyRead,this,&Receive::slot_readyRead);timer = new QTimer(this);connect(timer,&QTimer::timeout,this,&Receive::slot_timeout);
//    void (QUdpSocket:: *errorSign)(QAbstractSocket::SocketError) = &QUdpSocket::error;
//    connect(receiver,errorSign,this,&Receive::slot_error);//用不上error信号,发送端与接收端是无连接的,给关闭发送端,//对于接收端没有联动的影响
}Receive::~Receive()
{delete ui;
}void Receive::slot_readyRead()
{if(receiver->hasPendingDatagrams()){QHostAddress sendAddr;//发送者的IP地址quint16 port;//发送者的端口QByteArray text;text.resize(receiver->pendingDatagramSize());receiver->readDatagram(text.data(),(qint64)text.size(),&sendAddr,&port);qDebug()<<sendAddr.toString()<<port;//输出发送端的IP和端口号,(端口号还不是和能理解,为什么不是7777)ui->textEdit->setPlainText(text);//会自动在上一次的内容后面追加ui->label->setText(tr("数据接收完成!"));timer->start(2000);}
}void Receive::slot_error()
{qDebug()<<receiver->errorString();receiver->close();
}void Receive::slot_timeout()
{ui->label->setText(tr(" "));
}

以上是UDP通信时,发送端与接收端的代码,其main.cpp文件没有任何的改变,所以没有贴,由于Udp是无连接的,所以最后关于close()套接字,一般没有用到,因为发送完消息之后,调用close()来关闭套接字和没有调用close()关闭套接字的效果是一样的,他们之间没有连接,只是在传输数据时指定了端口与IP,当然很多东西还没有接触到具体视情况而定close()的有无。

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

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

相关文章

FB接连出事儿?上亿用户记录在亚马逊云服务器上就公之于众了……下滑到第七?领英说苹果怎么就不受雇员欢迎了呢? | 极客头条...

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 销售火…

C/C++ 有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

目录 一.结果演示二.源代码三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 面向对象 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 设计模式 零基础 C/C 学习路线推荐 : C/C 学习目录…

第三篇:Spring Boot整合Servlet

一、Springboot整合Servlet 第一种方案&#xff1a; 1、创建一个自定义的servlet&#xff0c;继承HttpServlet添加WebServlet注解 以前ssm中的web.xml配置文件中的servlet> <servlet><servlet-name>FirstServlet</servlet-name><servlet-class>c…

Qt中线程的简单使用

对于线程过去写的比较少&#xff0c;现在也几乎是小白的水平。先创建Qt empty project,即Qt空项目&#xff0c;打开QtCreate->文件->新建文件或项目->其它项目->empty qmke project,接着按提示创建Qt空项目&#xff0c;创建之后&#xff0c;在项目上右键添加新文件…

C/C++ 企业发放的奖金根据利润提成。利润 (i) 低于或等于 10 万元时,奖金可提 10% ;利润高 于 10 万元,低于 20 万元时,低于 10 万元的部分按 10% 提成,高于 10 万元

目录 一.结果演示二.源代码三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 面向对象 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 设计模式 零基础 C/C 学习路线推荐 : C/C 学习目录…

第四篇:Spring Boot 整合listener

一、Spring Boot整合listener 第一种方案&#xff1a;通过注解扫描完成Listener的注册 1.1 编写一个listener WebListener public class FirstListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.pri…

2019年关于VM和Kubernetes的思考 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;转自&#xff1a;开源云中文社区近年来&#xff0c;容器已成为云原生应用程序架构的同义词。它们重新定义了打包、分发、部署和管理应用程序的方式。但是&#xff0c;容器本身就是已有Linux技术的重新兴起&#xff0c;只不过这些技术…

Qt实现界面的窗口的局部动态添加并布局

此程序实现的是点击界面的添加界面按钮&#xff0c;新增加一个窗口&#xff0c;并实现窗口的布局&#xff0c;随着窗口个数的在布局中的增加&#xff0c;窗口大小自动缩小。创建基于QT widget Application的应用程序&#xff0c;选择基类QDialog,去掉Generate form前的勾&#…

第五篇:Spring Boot整合filter

一、Springboot整合Servlet 第一种方案&#xff1a;通过注解扫描完成filter组建的注册 1、编写自定义filter(FirstFilter) //urlPattern是一个数组可以添加多个 //WebFilter(filterName "FirstFilter",urlPatterns {"*.do","*.jsp"}) WebFilt…

C/C++ 一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?

目录 一.结果演示二.源代码三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 面向对象 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 设计模式 零基础 C/C 学习路线推荐 : C/C 学习目录…

QtCreate由MinGW编译的项目,换为MSVC编译器后编译无法通过

解决方法&#xff1a; 1.将文件的编码格式设置为utf-8且BOM格式&#xff1b; 2.在.pro文件中添加如下代码 msvc { QMAKE_CFLAGS /utf-8 QMAKE_CXXFLAGS /utf-8 } 其中方法一没有试过&#xff0c;我用的是方法二&#xff0c;可以编译通过。 还有一种方法&#xff1a; 在头文件…

微服务精华问答:什么是微服务架构中的DRY?| 技术头条

微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。 究竟什么是微服务呢?今天就让我们一探究竟。1Q&#xff1a;什么是微服务架构中的DRY&#xff1f;A&#xff1a;DRY代表不要重复自己。它基本上促进了重用代码的概念。这导致开发和…

第六篇:Spring Boot 访问静态资源

Spring Boot的默认静态资源的路径为&#xff1a; spring.resources.static-locationsclasspath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ 优先级从从高到低 一、Spring Boot 访问静态资源有二种方案 第一种方案&#xff08;默认&…

C/C++ 输入某年某月某日,判断这一天是这一年的第几天?

目录 一.结果演示二.源代码三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 面向对象 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 设计模式 零基础 C/C 学习路线推荐 : C/C 学习目录…

QT中DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80040216 ()问题的解决

亲身经历此问题的困惑后&#xff0c;第二次遇到该问题&#xff0c;实在忍不住想把这个解决方法写下来&#xff0c;愿对和我一样遇到该问题的人有所帮助。 至于Qt产生该问题的原因&#xff0c;网上众说纷云&#xff0c;但都是一样的&#xff0c;说是缺少一个视频解码器。造成的现…

成为最大的独立开源公司,对SUSE意味着什么? | 人物志

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;作者&#xff1a;孙浩峰如果你在科技展会上看到了一只可爱的绿色小蜥蜴&#x…

第七篇:Spring Boot 整合_Thymeleaf 入门试炼 QuickStart

1.1 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId&…

移动场景在其缩略图中显示场景中所显示的区域

需求描述 在场景中实现拖动&#xff0c;缩放&#xff0c;并在场景的缩略图中显示其对应在视口中显示的矩形区域。 程序效果图如下&#xff1a; 开发环境&#xff1a;Qt 5.13.1 编译环境&#xff1a;MinGW64 项目结构&#xff1a; 直接上程序: main.cpp #include "dial…

Intellij Idea: Thymeleaf 命名空间th报错

在Intellij Idea下使用Thymeleaf时&#xff0c;会报th命名空间不存在的错误&#xff0c;如th:href。 <!DOCTYPE html> <html> <head><title>Hello</title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8&q…

那些中国式家庭的小烦恼,我看用AI来解决就“都挺好” | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;转自&#xff1a;趣味科技v今天&#xff0c;又是《都挺好》全面承包热搜的一天。自从这…