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客户端和服务器之间的通信流程.客户不 ...
随机推荐
- 递归实现DropDownList层级
.NET下拉框DropDownList层级实现 这也算是第一篇博客吧,技术比较菜,写得不好,希望各位博友见谅哈,多多提提意见. 今天做电商网站新闻添加的时候,下拉框选择新闻类别觉得太长,又无法定位其准 ...
- 绕过CDN查找真实IP方法
0x01 验证是否存在CDN 方法1: 很简单,使用各种多地 ping 的服务,查看对应 IP 地址是否唯一,如果不唯一多半是使用了CDN, 多地 Ping 网站有:http://ping.china ...
- 【高性能Mysql 】读书笔记(三)
第5章 创建高性能的索引 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 索引基础 索引的重要性:找一本800面的书的某一段内容,没有目录也没有页码(页码也可类比 ...
- Qt_IO系统_文件
主要参考: devbean.net 豆子的博客 参考书:<QtCreator 快速入门>第三版 目录 QFile 如何使用QFile QFile 和QFileInfo Demo 文件操作是 ...
- svg 使用中的疑惑点
svg,g ,defs,symbol 都是容器元素,使用起来给人许多疑惑 svg-spirite-loader在页面生成的svg标签有什么特点? svg标签里面的symbol有什么用? 这些标签能够随 ...
- Linux find 查找 并删除文件 杀掉进程
find 默认在当前 即 . 目录下查找 du 文件名 / 目录 # 查看文件占用内存大小 1. 按照文件名查找 find / -name qwe # qwe为文件名 find / -name *qw ...
- vue : 本地调试跨域问题的解决办法:proxyTable
本来我是不想写的,但为了加深印象还是写一写吧. ./config/index.js module.exports = { dev: { // Paths assetsSubDirectory: 'st ...
- 京东阅读(web)体验优化
京东有电子书可以购买,可以多端阅读.比如PC客户端,移动端,以及本文提到的PC网站端. 先换个镜头,读书要记笔记(电子版本), 方便以后查阅. 镜头换回来,但是,我们为了方便肯定是想复制,下载啊,分享 ...
- Python 正则表达式简单了解
match 从字符串的开始匹配 如果开头不符合要求 就会报错 search 用字符串里的每一个元素 去匹配找的元素 1.匹配单个字符 \d 数字 \D 非数字 . 匹配任意字符 除了\n [] ...
- OpenLDAP on Centos7
一.环境准备 echo nameserver 114.114.114.114 > /etc/resolv.conf ##更改DNSecho 192.168.0.190 hello.com > ...