QT下UDP套接字通信——QUdpSocket 简单使用
QT下UDP套接字通信——QUdpSocket
- QUdpSocket类提供一个UDP套接字。
- UDP(用户数据报协议)是一种轻量级、不可靠、面向数据报、无连接的协议。它可以在可靠性不重要的情况下使用。QUdpSocket是QAbstractSocket的一个子类,允许您发送和接收UDP数据报。
- 注意:使用时需要在pro文件中添加network组件
QT += network
例子
效果展示

代码
- 发送端
.h
#ifndef SENDWIDGET_H
#define SENDWIDGET_H
#include "QPushButton"
#include "QLineEdit" #include <QWidget>
#include <QUdpSocket> class SendWIdget : public QWidget
{
Q_OBJECT
public:
explicit SendWIdget(QWidget *parent = nullptr);
~SendWIdget(); private slots:
void slo_sendMessge(); private:
void init(); private:
QLineEdit * edit;
QPushButton * btn; QUdpSocket * sender;
}; #endif // SENDWIDGET_H
.cpp
#include "SendWIdget.h" #include <QHBoxLayout>
#include <QTextCodec> SendWIdget::SendWIdget(QWidget *parent) : QWidget(parent)
{
// 初始化
init();
// 关联发送按钮的点击信号
connect(btn,&QPushButton::clicked,this,&SendWIdget::slo_sendMessge); } SendWIdget::~SendWIdget()
{
delete edit;
delete btn;
delete sender;
} void SendWIdget::slo_sendMessge()
{
// 获取输入框的内容
QString string(edit->text());
qDebug() << string;
/*发送数据
* 第一个参数:要发送的内容,这里是要发送输入框的内容,
* 参数没有QString类型,需要转换为QByteArray类型或Char*类型
* 第二个参数:要发送到的目标IP地址,这里是本机测试,所以用LocalHost
* 第三个参数:要发送的的目标端口,自己随意指定
* 返回值:发送成功返回发送的字节数,失败返回-1
*/
int w = sender->writeDatagram(string.toLocal8Bit(),QHostAddress::LocalHost,8179);
// 判断是否发送成功
if(w == -1)
{
qDebug() << "发送失败!";
}
else
{
qDebug() << "发送成功,字节数:" << w;
}
} /*
* 初始化界面和通信套接字
*/
void SendWIdget::init()
{
edit = new QLineEdit;
btn = new QPushButton("发送");
// 创建水平布局
QHBoxLayout * layout = new QHBoxLayout(this);
// 将行文本框添加到水平布局中
layout->addWidget(edit);
// 将发送按钮添加到水平布局
layout->addWidget(btn); // 初始化UDP套接字
sender = new QUdpSocket(this);
}
main
#include "widget.h"
#include "SendWIdget.h" #include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv); SendWIdget s;
s.setWindowTitle("send");
s.show(); return a.exec();
}
- 接收端
.h
#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QPlainTextEdit>
#include <QUdpSocket> class Widget : public QWidget
{
Q_OBJECT public:
Widget(QWidget *parent = 0);
~Widget();
private slots:
void slo_receiveMeaage(); private:
QPlainTextEdit * showMessage; QUdpSocket * receiver; }; #endif // WIDGET_H
.cpp
#include "widget.h" #include <QDebug>
#include <QTextCodec> Widget::Widget(QWidget *parent)
: QWidget(parent)
{
// 创建显示消息的文本框
showMessage = new QPlainTextEdit(this);
// 设置文本框只读
showMessage->setReadOnly(true);
// 设置文本框初始大小
showMessage->resize(300,200); // 创建UDP套接字
receiver = new QUdpSocket(this);
// 绑定接收信息的IP和端口
receiver->bind(QHostAddress::LocalHost,8179); // 关联readyRead信号(每当有新的数据可以从设备的当前读取通道读取时,这个信号就会发出一次)
connect(receiver,&QUdpSocket::readyRead,this,&Widget::slo_receiveMeaage);
} Widget::~Widget()
{
delete showMessage;
delete receiver;
} void Widget::slo_receiveMeaage()
{
// 用于存储接收到的数据
QByteArray message; // 循环读取接收的数据,如果至少有一个数据报等待读取,些函数返回 true,否则返回 false。
while (receiver->hasPendingDatagrams())
{
// 动态设置大小为第一个挂起的 udp 数据包的大小
message.resize(receiver->pendingDatagramSize());
/* 接收数据
* 第一个参数:存储接收到数据
* 第二个参数:接收的数据最大的大小
* 返回值:成功返回接收的数据字节数,失败返回-1
*/
int r = receiver->readDatagram(message.data(),message.size());
// 判断是否接收成功
if(r == -1)
{
qDebug() << "接收数据失败";
}
else
{
qDebug() << "接收数据成功";
}
}
//指定编码方式,否则如果数据中出现中文,会出现乱码情况
QTextCodec *codec = QTextCodec::codecForName("GBK");
QString string = codec->toUnicode(message);
qDebug() << string;
// 将编码后的数据显示到文本框中
showMessage->appendPlainText(string);
}
main
#include "widget.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show(); return a.exec();
}
QT下UDP套接字通信——QUdpSocket 简单使用的更多相关文章
- python UDP套接字通信
UDPserver.py import socket #导入套接字模块 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # - socket.A ...
- 基于套接字通信的简单练习(FTP)
本项目基于c/s架构开发(采用套接字通信,使用TCP协议) FTP-Socket"""__author:rianley cheng""" 功 ...
- Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信
一:基于多线程实现套接字 可添加多个客户端 from socket import * from threading import Thread def comunicate(conn): while ...
- python 之 网络编程(基于UDP协议的套接字通信)
8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...
- 基于tcp/udp协议的套接字通信
目录 一.套接字分类 二.套接字的工作流程 三.基于tcp协议的套接字 四.基于udp协议的套接字 一.套接字分类 1.基于文件类型的套接字家族:AF_UNIX 2.基于网络类型的套接字家族:AF_I ...
- JavaTCP和UDP套接字编程
在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站( ...
- Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象
一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字 server.bind() #把地址绑定到套接字,网络地址加端口 server.lis ...
- TCP/UDP套接字 java socket编程实例
网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. ...
- UNP学习笔记3——基本UDP套接字编程
1 概述 TCP和UDP网络编程存在一些本质的差异,主要是由于传输层的差别:UDP是无连接的不可靠的数据报协议,而TCP是面向连接的字节流协议. 下图是典型的UDP客户端和服务器之间的通信流程.客户不 ...
随机推荐
- Redis 相关运维操作
背景 Redis作为目前全球最流行的KV存储,除了使用之外,还需要做好日常的运维工作.关于运维相关的工作,本文从以下方面进行介绍说明(Redis5.0以上): 内存方面 客户端连接方面 工具方面 说明 ...
- TIBCO Jasper Report 中显示图片的方式
最近在做的项目中,需要输出很多报表类文档,于是选择用jasper来帮助完成. 使用jasper studio的版本是 :TIB_js-studiocomm_6.12.2_windows_x86_64. ...
- ffmpeg播放器实现详解 - 视频显示
ffplay是ffmpeg源码中一个自带的开源播放器实例,同时支持本地视频文件的播放以及在线流媒体播放,功能非常强大. FFplay: FFplay is a very simple and port ...
- 软件测试工程师应该怎样规划自己?成为年薪30W+测试工程师(乾坤未定,皆是黑马)
今天在知乎上被邀了一个问题,软件测试工程师应该怎样规划自己?16年毕业,技术方面已经渣到不行,因为之前的公司没有Python自动化测试这个要求,有些迷茫.我把我的问题回答贴出来希望可以帮助到更多有类型 ...
- 仔细想想SpringAOP也不难嘛,面试没有必要慌
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! LOGO SpringAOP 一.什么是AOP AOP(As ...
- C#和 JS的闭包
闭包的概念是内层的函数可以引用包含在它外层的函数的变量,即使外层函数的执行已经终止.但该 变量提供的值并非变量创建时的值,而是在父函数范围内的最终值. C#闭包可理解为跨作用域访问函数内变量,那么如何 ...
- OFDM通信系统的MATLAB仿真(1)
由于是第一篇博客,想先说点废话,其实自己早就想把学到的一些东西总结成文章随笔之类的供自己复习时查看的了.但是一是觉得自己学的的不够深入,总结也写不出什么很深刻的东西:二是觉得网上也有海量的资料了,需要 ...
- static关键字和final关键字
static关键字和final关键字 static(静态) 作用 用来修饰属性.方法.代码块.内部类 static修饰属性 表示静态变量(类变量) 按是否使用static修饰,属性的分类 静态属性 当 ...
- Gradle系列之认识Gradle任务
原文发于微信公众号 jzman-blog,欢迎关注交流. 前面几篇学习了 Gradle 构建任务的基础知识,了解了 Project 和 Task 这两个概念,建议先阅读前面几篇文章: Gradle系列 ...
- DJANGO-天天生鲜项目从0到1-003-用户模块-登录
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...