QT下UDP套接字通信——QUdpSocket

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

例子

效果展示

代码
  1. 发送端

.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();
}
  1. 接收端

.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 简单使用的更多相关文章

  1. python UDP套接字通信

    UDPserver.py import socket #导入套接字模块 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # - socket.A ...

  2. 基于套接字通信的简单练习(FTP)

    本项目基于c/s架构开发(采用套接字通信,使用TCP协议) FTP-Socket"""__author:rianley cheng""" 功 ...

  3. Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信

    一:基于多线程实现套接字 可添加多个客户端 from socket import * from threading import Thread def comunicate(conn): while ...

  4. python 之 网络编程(基于UDP协议的套接字通信)

    8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...

  5. 基于tcp/udp协议的套接字通信

    目录 一.套接字分类 二.套接字的工作流程 三.基于tcp协议的套接字 四.基于udp协议的套接字 一.套接字分类 1.基于文件类型的套接字家族:AF_UNIX 2.基于网络类型的套接字家族:AF_I ...

  6. JavaTCP和UDP套接字编程

    在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站( ...

  7. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字 server.bind() #把地址绑定到套接字,网络地址加端口 server.lis ...

  8. TCP/UDP套接字 java socket编程实例

    网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. ...

  9. UNP学习笔记3——基本UDP套接字编程

    1 概述 TCP和UDP网络编程存在一些本质的差异,主要是由于传输层的差别:UDP是无连接的不可靠的数据报协议,而TCP是面向连接的字节流协议. 下图是典型的UDP客户端和服务器之间的通信流程.客户不 ...

随机推荐

  1. 04 flask源码剖析之LocalStack和Local对象实现栈的管理

    04 LocalStack和Local对象实现栈的管理 目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于l ...

  2. scrapy 源码解析 (二):启动流程源码分析(二) CrawlerProcess主进程

    CrawlerProcess主进程 它控制了twisted的reactor,也就是整个事件循环.它负责配置reactor并启动事件循环,最后在所有爬取结束后停止reactor.另外还控制了一些信号操作 ...

  3. 证明:ThreadLocal的get,set方法无法防止内存泄漏

    先给出结论:get,set两个方法都不能完全防止内存泄漏,还是每次用完ThreadLocal都勤奋的remove一下靠谱. 前言:   看到有的博客说在把ThreadLocal的所有强引用置空前,调用 ...

  4. CSS文本溢出,显示省略号(...)

    方式1:这种方式就是必须要跟width搭配使用,当你使用的display:flex; 的时候可能会影响样式 width: 200px; overflow: hidden; /*超出部分隐藏*/ tex ...

  5. db2数据库字段更新当前时间

    db2数据库中想要将字段的时间通过sql语句的方式更新: 例如: Update tablename set 字段1='打酱油', 字段2 = TO_CHAR(current timestamp,'YY ...

  6. OSCP Learning Notes - Buffer Overflows(3)

    Finding Bad Characters 1. Find the bad charaters in the following website: https://bulbsecurity.com/ ...

  7. Java顺序查找、二分查找

    Java顺序查找.二分查找   查找算法中顺序查找算是最简单的了,无论是有序的还是无序的都可以,只需要一个个对比即可,但其实效率很低. 顺序查找 动图演示 详细代码 // 顺序查找 public st ...

  8. javascript : splice(0) 的妙用

    今天看前同事的代码,有个写法很有意思: splice(0). 有意思的是,这并不是一个“合法”的写法. w3school是这样写的: arrayObject.splice(index,howmany, ...

  9. 【JVM之内存与垃圾回收篇】虚拟机栈

    虚拟机栈 虚拟机栈概述 由于跨平台性的设计,Java 的指令都是根据栈来设计的.不同平台 CPU 架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同 ...

  10. TLV通信协议

    基础 TLV协议是BER编码的一种,全称是Tag.length.value.该协议简单高效,能适用于各种通信场景,且具有良好的可扩展性.TLV协议的基本格式如下: 其中,Tag占2个字节,是报文的唯一 ...