qt下udp套接字通信——qudpsocket简单使用(代码片段)

doyoung doyoung     2022-12-03     380

关键词:

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学习第四天

...字使用QTcpSocket:用于TCP/IP通信,作为客户端套接字使用QUdpSocket:用于UDP通信,服务器客服端都使用此套接字。一、TCP编程linux下Qt下1.TCP/IP服务器端通信的流程创建套接字将套接字设置为监听模式等待并接收客户端请 查看详情

qt网络编程udp下c/s架构广播通信

QT有封装好的UDP协议的类,QUdpSocket,里面有我们想要的函数接口。感兴趣的话,可以看看。先搞服务端吧,写一个子类,继承QDialog类,起名为UdpServer类。头文件要引用我们上边说的QUdpSocket这个类,还有我们想要的布局的类。1#if... 查看详情

qtsocket网络通信

...否则无法使用Qt的网络功能。  #include<QtNetwork>QUdpSocket*sender;sender=newQUdpSocket(this);QByteArraydatagram=“hello 查看详情

qudpsocket简单用法

...传输协议,可以用在可靠传输不是很重要的情况下使用。QUdpSocket是QAbstractSocket的子类,它们都继承了QIODevice。所以可以用QUdpSocket进行发送接收数据。它和QTcpSocket最大的区别也就是,发送数据之前不需要建立连接。以下简单例子... 查看详情

qt/c++——网络编程(代码片段)

...extEdit>#include<QLineEdit>#include<QPushButton>#include<QUdpSocket>#include<QHostAddress>classWidget:publicQWidgetQ_OBJECTpublicslots:voidsenddata()udpsock->writeDatagram(le->text().toStdString().c_str(),QHostA 查看详情

qt之udp通信

...etworkQT+=coreguinetwork进行UDP通信需要用到的头文件#include<QUdpSocket>这里我们把UDP通信分为两个部分写,一个是发送端,另一个是接收端,而发送端中又分为单播、组播和广播三种 查看详情

qt5之udp通信(代码片段)

...探测附近的设备减轻服务端的压力UDP步骤服务端定义一个套接字s定义文件描述符定义缓冲字符串申请一个套接字作用在文件描述符上参数一:协议->IPv4/IPv6PF_INET/PF_INET6参数二:套接字类型->UDP无连接/TCP有连接SOCK_DGRAM/SOCK_STRE... 查看详情

qt学习之socket通信(世界上最简单的例子了)

...在LINUX下进行网络编程,我们可以使用LINUX提供的统一的套接字接口。但是这种方法牵涉到太多的结构体,比如IP地址,端口转换等,不熟练的人往往容易犯这样那样的错误。QT中提供的SOCK 查看详情

qt-udp通信(代码片段)

...接的到达。udp通信模型如下: (1)服务器端1)创建套接字;2)绑定套接字;3)接收或发送数据;4)关闭连接。(2)客户端 查看详情

qudpsocket-qt使用udp通讯实现服务端和客户端

...创。转载请以链接形式标明本文标题和地址:本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端     本文地址:http://techieliang.com/2017/12/532/文章目录1.QNetworkDatagram2.客户端3.服务端4.消息收发1.QNetworkDa 查看详情

我如何知道 QUdpSocket 中的发送端口号?

】我如何知道QUdpSocket中的发送端口号?【英文标题】:HowdoIknowthesendingportnumberinQUdpSocket?【发布时间】:2012-07-1705:56:31【问题描述】:有没有办法获取udp套接字用来发送消息的端口号?我想做的是向某人发送一个udp数据报并监听... 查看详情

使用 QUdpSocket 的 Qt4 DNS 服务器

】使用QUdpSocket的Qt4DNS服务器【英文标题】:Qt4DNSServerusingQUdpSocket【发布时间】:2009-09-0904:54:38【问题描述】:我正在为我正在开发的应用程序编写DNS服务器,但遇到了一些困难。我想绑定到localhost的53端口并监听DNS查询请求,然... 查看详情

qt在windows下的udp通信(最简单)

qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境:主机:win7开发环境:qt 功能:用udp进行收发通信 界面: 源代码:LssHost.pro: [cpp] viewplain copy #------------ 查看详情

qt的udp通信编程问题

...,实现了类似QQ的两个对话框程序的文字通信,采用的是Qudpsocket。其中有两句涉及到IP地址:hostaddr1=newQHostAddress("1.1.1.1");//不透露信息我随便写的IPboolconn=udpSocket->bind(*hostaddr1,Port1);//IP是通过百度查的我本机的IP,但我电... 查看详情

udp实现网络通信(代码片段)

本章节使用socket套接字利用udp在python环境下实现简单的半双工通信,udp全双工会在后面多任务章节讲到。importsocket#导入socket模块defrecv():#在recvfrom这里形成阻塞,参数为最大接收容量#message返回值为两个参数的元组(返回内容,(ip,... 查看详情

关于qt中udp的连接问题

...简单的udp接收端程序,以下是部分程序 boolconn; receiver=newQUdpSocket(this); conn=receiver->bind(6000,QUdpSocket::ShareAddress); connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram())); if(conn==0) ui->textBrowser->append("shibai"); else ui-&g... 查看详情

什么是网络套接字

参考技术A套接字(socket)是用于网络通信的基本操作单元。简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。套接字可以根据通信性质分类,主要分流式套接字(sock_stream),数据报套接字(sock_dgram)以及... 查看详情

82.基于tcp和udp协议的简单通信套接字编程(代码片段)

目录一、基于tcp协议的简单通信套接字编程二、加上通信循环三、加上链接循环一、基于tcp协议的简单通信套接字编程#客户端、importsocket#1、买手机phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#流式协议=》tcp协议#2、拨通服务端电... 查看详情