Qt 利用UDP进行通信

news/2024/5/18 14:00:42 标签: qt, udp, 网络编程, qt教程, qt开发

一、UDP的特点

UDP(用户数据报协议)是一种简单轻量级、不可靠、面向数据报,无连接的传输层协议。而TCP/IP协议却是有连接的

二、UDP适合应用的几种情况

1、网络数据大多为短消息

2、拥有大量客户端

3、对数据安全性无特殊要求

4、网络负担非常重,但对响应速度要求高。

三、利用UDP进行网络通信

因为upd是无连接的,所以两个通信设备之间不需要建立连接,只要知道对方的IP地址和端口号就行了。

我们首先创建一个项目,这个项目需要用到ui界面,所以我们还是使用Qtdesigner,并且还要给它布好局。

首先我们需要绑定端口号,如果在同一台电脑上测试IP地址可以不需要绑定,绑定的时候我们用到bind()函数。

CSDN QT大纲:Qt开发必备技术栈学习路线和资料

例:

udpsocket->bind(8000);

接收数据

当接收到数据的时候,socket会自动触发readyRead这个信号,所以需要写一个参函数来处理这个信号,也就是读取socket接收到的数据。

接收数据的时候我们需要用到这个一个函数

readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)

这个函数的参数的含义如下

1、将读取的内容存放在data中

2、读取的长度

3、对方的ip地址

4、对方的端口号

最后将读取的内容显示在文本编辑框里就可以了。

发送数据

发送数据的步骤和读取数据的步骤差不多的,首先需要获取界面中的端口,ip地址和文本编辑框中的内容,然后通过writeDatagram()这个函数来发送。

writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)

这个函数的参数含义如下

1、需要发送的消息

2、对方的IP地址

3、对方的端口号

四、发送和接收的代码

发送

 1 void Widget::on_pushButtonwrite_clicked()
 2 {
 3     //获取对方的端口号和ip
 4     QString ip = ui->lineEditip->text();
 5     quint16 port = ui->lineEditport->text().toInt();
 6  
 7     //获取文本框的内容
 8     QString str = ui->textEdit->toPlainText();
 9  
10     //将信息发送给指定的ip
11     udpsocket->writeDatagram(str.toUtf8(), (QHostAddress)ip, port);
12 }

接收

 1 void Widget::readData()
 2 {
 3     char buf[1024] = {0};
 4     QHostAddress addr; //对方的ip
 5     quint16 port; //对方的端口
 6     qint64 len;
 7     len = udpsocket->readDatagram(buf, sizeof(buf), &addr, &port);
 8     {
 9         if(len > 0)
10         {
11             QString str = QString("[%1:%2]  %3").arg(addr.toString()).arg(port).arg(buf);
12             ui->textEdit->setText(str);
13         }
14     }
15 }

编译运行之后如下图

 我这里因为需要两个窗口进行通信,所以将另一个程序的端口号改成了8888。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓


http://www.niftyadmin.cn/n/11324.html

相关文章

[附源码]计算机毕业设计JAVA某城市参军和退役军人信息管理系统

[附源码]计算机毕业设计JAVA某城市参军和退役军人信息管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&#xff…

ArrayList,LinkedList和Vector的区别

他们三个都是属于java.util包中的List接口,均为可以伸缩的数组可以动态改变长度 ArrayList和Vector ArrayList和Vector都是基于Object[] array实现的,他们会在内存中开辟连续地址,由于地址连续他们支持用下标搜索数据,同时索引数…

C文件操作

第1关:使用FILE结构操作文本文件 任务描述 本关任务:编写函数,该函数从已有的当前目录下的文件a.txt中读取并解析出其中的数值,并将结果写到当前目录下的文件b.txt中。 相关知识 文件 文件是存储在某种长期储存设备(磁盘、光盘等)上的一段数据流。C 语言中把文件看成一…

Java岗位必备技能SpringBoot的面试题集锦

当下SpringBoot框架真的很火,大多数企业把它作为基础技能,考察求职者的能力。如下截图,是我从Boss直聘中找到的,要求SpringBoot是必备技能。 所以非常有必要为了面试,好好归纳下SpringBoot常被提起来的问题。 题目大纲…

std::c++ 中格式化任意字符串

//std::c 中没有Format 函数&#xff0c;但我们可以写一个&#xff0c;如下: #include <iostream> #include <stdarg.h> #include <vector> using namespace std; /// // 向一块内存区格式化一个字符串&#xff0c;到底应该char[256],char[512],char[1024]…

Android服务器的通信方式

目录 一.HTTP协议 1.简介 2.Get和Post的使用 1.Get请求 2.Post请求 3.Get请求和Post请求的区别 二.Socket Socket的使用类型主要有两种&#xff1a; 客户端&#xff1a; 三.Socket 与 Http 对比 Android与服务器的通信方式主要有两种&#xff0c;一是Http通信&#xf…

怎么查找计算机SCI文献? - 易智编译EaseEditing

1、科技文献检索途径 (1) 文献名途径&#xff1a;杂志名称、标题、关键字等等; (2) 作者途径&#xff1b; (3) 文献主题&#xff1a;根据文献的主要内容&#xff0c;例如主题索引、关键词索引等等&#xff1b; (4) 序号途径&#xff1a;文章 DOI 号。 (5) 其他途径&#x…

SpringBoot: Controller层的优雅实现

目录1. 实现目标2. 统一状态码3. 统一响应体4. 统一异常5. 统一入参校验6. 统一返回结果7. 统一异常处理8. 验证1. 实现目标 优雅校验接口入参响应体格式统一处理异常统一处理 2. 统一状态码 创建状态码接口&#xff0c;所有状态码必须实现这个接口&#xff0c;统一标准 pa…