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. 递归实现DropDownList层级

    .NET下拉框DropDownList层级实现 这也算是第一篇博客吧,技术比较菜,写得不好,希望各位博友见谅哈,多多提提意见. 今天做电商网站新闻添加的时候,下拉框选择新闻类别觉得太长,又无法定位其准 ...

  2. 绕过CDN查找真实IP方法

    0x01 验证是否存在CDN 方法1: 很简单,使用各种多地 ping 的服务,查看对应 IP 地址是否唯一,如果不唯一多半是使用了CDN, 多地 Ping 网站有:http://ping.china ...

  3. 【高性能Mysql 】读书笔记(三)

    第5章 创建高性能的索引 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 索引基础 索引的重要性:找一本800面的书的某一段内容,没有目录也没有页码(页码也可类比 ...

  4. Qt_IO系统_文件

    主要参考: devbean.net 豆子的博客 参考书:<QtCreator 快速入门>第三版 目录 QFile 如何使用QFile QFile 和QFileInfo Demo 文件操作是 ...

  5. svg 使用中的疑惑点

    svg,g ,defs,symbol 都是容器元素,使用起来给人许多疑惑 svg-spirite-loader在页面生成的svg标签有什么特点? svg标签里面的symbol有什么用? 这些标签能够随 ...

  6. Linux find 查找 并删除文件 杀掉进程

    find 默认在当前 即 . 目录下查找 du 文件名 / 目录 # 查看文件占用内存大小 1. 按照文件名查找 find / -name qwe # qwe为文件名 find / -name *qw ...

  7. vue : 本地调试跨域问题的解决办法:proxyTable

    本来我是不想写的,但为了加深印象还是写一写吧. ./config/index.js module.exports = { dev: { // Paths assetsSubDirectory: 'st ...

  8. 京东阅读(web)体验优化

    京东有电子书可以购买,可以多端阅读.比如PC客户端,移动端,以及本文提到的PC网站端. 先换个镜头,读书要记笔记(电子版本), 方便以后查阅. 镜头换回来,但是,我们为了方便肯定是想复制,下载啊,分享 ...

  9. Python 正则表达式简单了解

    match 从字符串的开始匹配  如果开头不符合要求  就会报错 search  用字符串里的每一个元素  去匹配找的元素 1.匹配单个字符 \d 数字 \D 非数字 . 匹配任意字符 除了\n [] ...

  10. OpenLDAP on Centos7

    一.环境准备 echo nameserver 114.114.114.114 > /etc/resolv.conf ##更改DNSecho 192.168.0.190 hello.com > ...